Git development
 help / color / mirror / Atom feed
* Get rid of .git/branches/ and .git/remotes/?
From: Johannes Schindelin @ 2005-11-20 17:00 UTC (permalink / raw)
  To: git

Hi,

I just had a crazy idea. Since we have a framework in place to read/write 
.git/config, I thought that maybe it would be a nice thing to move the 
information which is in .git/branches or .git/remotes into the config.

Advantages:

- it would be easy to copy your private configuration by copying just one 
  file,

- it would be easy to add a switch to git-fetch/git-pull to actually
  store/update the URL and head mapping under a certain nick,

- we could get rid of some parsing code, and

- it would arguably be more consistent.

Disadvantage:

- I know, I know, yet another change to the location of this 
  information...

- (very lame) you could not find out which nicks you have stored with "ls"

Comments?

Ciao,
Dscho

P.S.: I did not yet say anything about .git/info/, did I?

^ permalink raw reply

* [PATCH] max-count in terms of intersection
From: Luben Tuikov @ 2005-11-20 15:53 UTC (permalink / raw)
  To: git

When a path designation is given, max-count counts the number
of commits therein (intersection), not globally.

This avoids the case where in case path has been inactive
for the last N commits, --max-count=N and path designation
at git-rev-list is given, would give no commits.

Signed-off-by: Luben Tuikov <ltuikov@yahoo.com>

---

 rev-list.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

applies-to: 5b820842ce0afb836ddbeded3a3f9e8d0ba223f9
768b79de9eadc38a839332df0fcce021f7174d6d
diff --git a/rev-list.c b/rev-list.c
index 6e6ffde..e17f928 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -124,8 +124,6 @@ static int filter_commit(struct commit *
                stop_traversal=1;
                return CONTINUE;
        }
-       if (max_count != -1 && !max_count--)
-               return STOP;
        if (no_merges && (commit->parents && commit->parents->next))
                return CONTINUE;
        if (paths && dense) {
@@ -148,6 +146,9 @@ static int process_commit(struct commit 
                return CONTINUE;
        }
 
+       if (max_count != -1 && !max_count--)
+               return STOP;
+
        show_commit(commit);
 
        return CONTINUE;
---
0.99.9.GIT

^ permalink raw reply related

* Re: [PATCH] Cogito documentation updates
From: Randal L. Schwartz @ 2005-11-20 15:37 UTC (permalink / raw)
  To: Jonas Fonseca; +Cc: Petr Baudis, git
In-Reply-To: <20051120101112.GA2302@diku.dk>

>>>>> "Jonas" == Jonas Fonseca <fonseca@diku.dk> writes:

Jonas>  - local cg-fetch now works without the cp option -u

But it still requires cp -d, unless some other patch fixed that recently.

-- 
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

^ permalink raw reply

* Simple proxy test (was Re: What's in master tonight)
From: Yaacov Akiba Slama @ 2005-11-20 14:28 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git
In-Reply-To: <7v7jb31zm2.fsf@assigned-by-dhcp.cox.net>

Junio C Hamano wrote:

>proxy for git:// transport:
>
>	I do not have any pending issues on this patch, and I
>	think it is ready to go in when somebody, preferably
>	other than the original author, says it is useful and
>	does not break things.
>
I tested the proxy code from a place when the git:// port is blocked.

1) I made a ssh socks tunel (ssh -D 2080 a-remote-server).
2) I compiled connect.c from 
http://zippo.taiyo.co.jp/~gotoh/ssh/connect.html
3) I created a simple script called myproxy:

#!/bin/sh

/path/to/connect -S localhost:2080 $@

4) GIT_PROXY_COMMAND=/path/to/myproxy
cg-clone git://git.kernel.org/pub/scm/git/git.git git2 worked perfectly

4bis)
% cat .git/config
[core]
gitproxy = /path/to/myproxy for kernel.org

cg update worked perfectly.

--yas

^ permalink raw reply

* [PATCH] git-config-set: support selecting values by non-matching regex
From: Johannes Schindelin @ 2005-11-20 12:24 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git
In-Reply-To: <7vr79b3i7e.fsf@assigned-by-dhcp.cox.net>


Extend the regex syntax of value_regex so that prepending an exclamation
mark means non-match:

	[core]
		quetzal = "Dodo" for Brainf*ck
		quetzal = "T. Rex" for Malbolge
		quetzal = "cat"

You can match the third line with

	git-config-set --get quetzal '! for '

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

---

	On Sat, 19 Nov 2005, Junio C Hamano wrote:

	> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
	> 
	> > 	The only thing I am concerned about now is how to deal with
	> > 	anti value_regex's, i.e.
	> >...
	> > 	Note: we could adjust the pattern syntax so that a prefix "!"
	> > 	means "no match", and "\!" means "match literal !", but this
	> > 	is ugly.
	> 
	> I do not think it is so bad, except that I would not even bother
	> doing the quoting of prefix '!'; the user can always say '[!]'
	> to mean a positive match that begins with an exclamation point.

	The patch is a little bit bigger, because I included also the
	documentation update and test cases proving that it works.

	Also, the matching part got minimally refactored in config.c.


 Documentation/git-config-set.txt |   18 +++++++++++++++++-
 config-set.c                     |    9 ++++++++-
 config.c                         |   23 +++++++++++++++++------
 t/t1300-config-set.sh            |   28 ++++++++++++++++++++++++++++
 4 files changed, 70 insertions(+), 8 deletions(-)

applies-to: 648bd602281a789b2dbcecedeae32321bb09ccbf
e2e9f798d6aa02ca54193f0c84d916d0e1a1d29b
diff --git a/Documentation/git-config-set.txt b/Documentation/git-config-set.txt
index c707fbc..bfbd421 100644
--- a/Documentation/git-config-set.txt
+++ b/Documentation/git-config-set.txt
@@ -22,7 +22,9 @@ actually the section and the key separat
 escaped.
 
 If you want to set/unset an option which can occor on multiple lines, you
-should provide a POSIX regex for the value.
+should provide a POSIX regex for the value. If you want to handle the lines
+*not* matching the regex, just prepend a single exlamation mark in front
+(see EXAMPLES).
 
 This command will fail if
 
@@ -82,6 +84,7 @@ Given a .git/config like this:
 		command="ssh" for "ssh://kernel.org/"
 		command="proxy-command" for kernel.org
 		command="myprotocol-command" for "my://"
+		command=default-proxy ; for all the rest
 
 you can set the filemode to true with
 
@@ -139,6 +142,19 @@ new one with
 % git config-set --replace-all proxy.command ssh
 ------------
 
+However, if you really only want to replace the line for the default proxy,
+i.e. the one without a "for ..." postfix, do something like this:
+
+------------
+% git config-set proxy.command ssh '! for '
+------------
+
+To actually match only values with an exclamation mark, you have to
+
+------------
+% git config-set section.key value '[!]'
+------------
+
 
 Author
 ------
diff --git a/config-set.c b/config-set.c
index 90a28b3..5f654f7 100644
--- a/config-set.c
+++ b/config-set.c
@@ -8,13 +8,15 @@ static char* key = NULL;
 static char* value = NULL;
 static regex_t* regex = NULL;
 static int do_all = 0;
+static int do_not_match = 0;
 static int seen = 0;
 
 static int show_config(const char* key_, const char* value_)
 {
 	if (!strcmp(key_, key) &&
 			(regex == NULL ||
-			 !regexec(regex, value_, 0, NULL, 0))) {
+			 (do_not_match ^
+			  !regexec(regex, value_, 0, NULL, 0)))) {
 		if (do_all) {
 			printf("%s\n", value_);
 			return 0;
@@ -38,6 +40,11 @@ static int get_value(const char* key_, c
 		key[i] = tolower(key_[i]);
 
 	if (regex_) {
+		if (regex_[0] == '!') {
+			do_not_match = 1;
+			regex_++;
+		}
+
 		regex = (regex_t*)malloc(sizeof(regex_t));
 		if (regcomp(regex, regex_, REG_EXTENDED)) {
 			fprintf(stderr, "Invalid pattern: %s\n", regex_);
diff --git a/config.c b/config.c
index 697d79f..5d237c8 100644
--- a/config.c
+++ b/config.c
@@ -269,6 +269,7 @@ int git_config(config_fn_t fn)
 static struct {
 	int baselen;
 	char* key;
+	int do_not_match;
 	regex_t* value_regex;
 	int multi_replace;
 	off_t offset[MAX_MATCHES];
@@ -276,13 +277,19 @@ static struct {
 	int seen;
 } store;
 
+static int matches(const char* key, const char* value)
+{
+	return !strcmp(key, store.key) &&
+		(store.value_regex == NULL ||
+		 (store.do_not_match ^
+		  !regexec(store.value_regex, value, 0, NULL, 0)));
+}
+
 static int store_aux(const char* key, const char* value)
 {
 	switch (store.state) {
 	case KEY_SEEN:
-		if (!strcmp(key, store.key) &&
-				(store.value_regex == NULL ||
-				!regexec(store.value_regex, value, 0, NULL, 0))) {
+		if (matches(key, value)) {
 			if (store.seen == 1 && store.multi_replace == 0) {
 				fprintf(stderr,
 					"Warning: %s has multiple values\n",
@@ -306,9 +313,7 @@ static int store_aux(const char* key, co
 		/* fallthru */
 	case SECTION_END_SEEN:
 	case START:
-		if (!strcmp(key, store.key) &&
-				(store.value_regex == NULL ||
-				!regexec(store.value_regex, value, 0, NULL, 0))) {
+		if (matches(key, value)) {
 			store.offset[store.seen] = ftell(config_file);
 			store.state = KEY_SEEN;
 			store.seen++;
@@ -471,6 +476,12 @@ int git_config_set_multivar(const char* 
 		if (value_regex == NULL)
 			store.value_regex = NULL;
 		else {
+			if (value_regex[0] == '!') {
+				store.do_not_match = 1;
+				value_regex++;
+			} else
+				store.do_not_match = 0;
+
 			store.value_regex = (regex_t*)malloc(sizeof(regex_t));
 			if (regcomp(store.value_regex, value_regex,
 					REG_EXTENDED)) {
diff --git a/t/t1300-config-set.sh b/t/t1300-config-set.sh
index 717bf4d..59b6c4c 100644
--- a/t/t1300-config-set.sh
+++ b/t/t1300-config-set.sh
@@ -69,6 +69,28 @@ EOF
 
 test_expect_success 'similar section' 'cmp .git/config expect'
 
+test_expect_success 'replace with non-match' \
+	'git-config-set core.penguin kingpin !blue'
+
+test_expect_success 'replace with non-match (actually matching)' \
+	'git-config-set core.penguin "very blue" !kingpin'
+
+cat > expect << EOF
+#
+# This is the config file
+#
+
+[core]
+	penguin = very blue
+	Movie = BadPhysics
+	UPPERCASE = true
+	penguin = kingpin
+[Cores]
+	WhatEver = Second
+EOF
+
+test_expect_success 'non-match result' 'cmp .git/config expect'
+
 cat > .git/config << EOF
 [beta] ; silly comment # another comment
 noIndent= sillyValue ; 'nother silly comment
@@ -173,6 +195,12 @@ EOF
 
 test_expect_success 'multivar' 'cmp .git/config expect'
 
+test_expect_success 'non-match' \
+	'git-config-set --get nextsection.nonewline !for'
+
+test_expect_success 'non-match value' \
+	'test wow = $(git-config-set --get nextsection.nonewline !for)'
+
 test_expect_failure 'ambiguous get' \
 	'git-config-set --get nextsection.nonewline'
 
---
0.99.9.GIT

^ permalink raw reply related

* [PATCH] merge-recursive: Replace 'except:'
From: Fredrik Kuivinen @ 2005-11-20 12:14 UTC (permalink / raw)
  To: git; +Cc: junkio

Plain except:s are evil as they will catch all kinds of exceptions
including NameError and AttrubiteError.

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>


---

 git-merge-recursive.py |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

applies-to: c037ce1b974c7d0671312b52ed46ed405c1a8443
e90840aaf9adb880297d98e16031665b426e3987
diff --git a/git-merge-recursive.py b/git-merge-recursive.py
index 52e2ad7..3e7758d 100755
--- a/git-merge-recursive.py
+++ b/git-merge-recursive.py
@@ -243,7 +243,7 @@ def updateFileExt(sha, mode, path, updat
 
             try:
                 createDir = not stat.S_ISDIR(os.lstat(p).st_mode)
-            except: 
+            except OSError:
                 createDir = True
             
             if createDir:
---
0.99.9.GIT

^ permalink raw reply related

* Re: [PATCH] merge-recursive::removeFile: remove empty directories
From: Fredrik Kuivinen @ 2005-11-20 11:51 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Linus Torvalds, Christoph Hellwig, Paul Mackerras, linuxppc64-dev,
	Git Mailing List, Fredrik Kuivinen
In-Reply-To: <7vy83k2bwn.fsf@assigned-by-dhcp.cox.net>

On Sat, Nov 19, 2005 at 08:14:48PM -0800, Junio C Hamano wrote:
> When the last file in a directory is removed as the result of a
> merge, try to rmdir the now-empty directory.
> 
> Signed-off-by: Junio C Hamano <junkio@cox.net>
> 
> ---
> 
>  And this is the one for 'git pull -s recursive' which is the
>  default these days.
> 
>  git-merge-recursive.py |    4 ++++
>  1 files changed, 4 insertions(+), 0 deletions(-)
> 
> applies-to: ea62f7003bb2769fa23d5ca371d84cee9d2ec46f
> 80e21a9ed809d98788ff6fb705d911bee37d460b
> diff --git a/git-merge-recursive.py b/git-merge-recursive.py
> index d7d36aa..37258ad 100755
> --- a/git-merge-recursive.py
> +++ b/git-merge-recursive.py
> @@ -293,6 +293,10 @@ def removeFile(clean, path):
>          except OSError, e:
>              if e.errno != errno.ENOENT and e.errno != errno.EISDIR:
>                  raise
> +        try:
> +            os.removedirs(os.path.dirname(path))
> +        except:
> +            pass
>  

Looks good, but I would prefer to have 'except OSError:' instead of
the except without any exception class. A plain 'except:' will catch
every kind of exception which includes things such as NameError and
AttributeError and we really don't want to silently ignore those two.

A plain 'except:' exists in one other place (actually two, but one of
them is ok) in git-merge-recursive.py. I will send a patch to remove
that one.

- Fredrik

^ permalink raw reply

* Re: [RFC] Applying a graft to a tree and "rippling" the changes through
From: Johannes Schindelin @ 2005-11-20 11:44 UTC (permalink / raw)
  To: Matthias Urlichs; +Cc: git
In-Reply-To: <20051120073244.GA7902@kiste.smurf.noris.de>

Hi,

On Sun, 20 Nov 2005, Matthias Urlichs wrote:

> Why not simply use info/grafts?

'Cause you can't fetch a graft. But I agree, instead of telling somebody: 
"I have this new branch which unifies history", you can send your friend a 
oneliner which appends a graft.

Ciao,
Dscho

^ permalink raw reply

* Re: [PATCH] gitk: moving all three panes if clicking on an arrow.
From: Paul Mackerras @ 2005-11-20 10:20 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Stefan-W. Hahn, git
In-Reply-To: <7vfyptavik.fsf@assigned-by-dhcp.cox.net>

Junio C Hamano writes:

> Paul, I earlier sent a pull request; I included this patch there
> as well.  So you will find the following four.

Thanks, pulled and pushed out.

Regards,
Paul.

^ permalink raw reply

* [PATCH] Cogito documentation updates
From: Jonas Fonseca @ 2005-11-20 10:11 UTC (permalink / raw)
  To: Petr Baudis; +Cc: git

 - local cg-fetch now works without the cp option -u
 - note the difference between short and long help in cg-help(1)
 - mention the alien repo importers provided by the git core
 - fix typo in cg-update(1)

Signed-off-by: Jonas Fonseca <fonseca@diku.dk>

---
diff --git a/README.osx b/README.osx
index e82ef79..d8df872 100644
--- a/README.osx
+++ b/README.osx
@@ -9,18 +9,6 @@ You may have to deal with md5 mismatches
 your new Portfile or place the new tarball in
 /opt/local/var/db/dports/distfiles/cogito.
 
-Caveats:
-
-cg-fetch on a local repository requires cp -u, a non-portable gnu
-extension.  This means that cg-fetch, cg-clone and cg-update from a
-local repository are broken.
-
-Workaround #1: Use rsync for local clones.  I.e.  "cg-clone
-rsync://localhost/dir" instead of "cg-clone dir".  This loses the disk
-space savings of normally gained by cg-clone.
-
-Workaround #2: Use gnu cp.  "cd /opt/local/bin; sudo ln -s gcp cp".
-
 Recommendations:
 
 The gnu versions of "stat" and "date" are preferred over their BSD
diff --git a/cg-help b/cg-help
index 6ba7657..5fa65ef 100755
--- a/cg-help
+++ b/cg-help
@@ -8,8 +8,9 @@
 # If the argument is left out an overview of all the Cogito commands will
 # be shown.
 #
-# Note help for a command is also available by passing `--help` or `-h`
-# to the command.
+# Note, short help for a command is also available by passing `--help` or
+# `-h` to the command. The complete command manual is shown when passing
+# `--long-help` (and is the same as doing "`cg-help command`").
 #
 # OPTIONS
 # -------
diff --git a/cg-init b/cg-init
index a0a7372..31c2e10 100755
--- a/cg-init
+++ b/cg-init
@@ -9,7 +9,9 @@
 # This command is intended for creating repositories for work on new projects.
 # If you want to clone an existing project, see `cg-clone`. If you want to
 # set up a public repository not for direct work but only for pushing/pulling,
-# see `cg-admin-setuprepo`.
+# see `cg-admin-setuprepo`. It is also possible to import repositories from
+# other SCMs to GIT, see `git-cvsimport(1)`, `git-svnimport(1)` and
+# `git-archimport(1)`.
 #
 # OPTIONS
 # -------
diff --git a/cg-update b/cg-update
index ed93c01..9d82fcb 100755
--- a/cg-update
+++ b/cg-update
@@ -8,7 +8,7 @@
 # This is similar to running cg-fetch and cg-merge commands successively.
 # Please refer to the documentation of those commands for more details
 # about the operation. Note that if you are not doing own development
-# but only following some project, you it is recommended to use this command
+# but only following some project, it is recommended to use this command
 # instead of `cg-fetch` + `cg-merge` since `cg-update` can handle some
 # additional corner cases (in particular, if the remote branch rebases,
 # `cg-update` will fast-forward instead of doing a tree merge and diverging).

-- 
Jonas Fonseca

^ permalink raw reply related

* [PATCH] Support username and password inside URL
From: Kalle Valo @ 2005-11-20 10:05 UTC (permalink / raw)
  To: git
In-Reply-To: <87u0e71zpx.fsf@litku.valo.iki.fi>

Currently usage of curl was so that netrc was mandatory and passwords in URL
weren't allowed. Change netrc to optional to make HTTP basic authentication
with username and password in URL also work.

Here's an example of such URL:

http://foo:bar@www.example.com/auth.git/

Signed-off-by: Kalle Valo <Kalle.Valo@iki.fi>

---

 git-clone.sh     |    2 +-
 git-fetch.sh     |    2 +-
 git-ls-remote.sh |    2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

applies-to: 8839be40e9401452691ae1b0bf4c86ac616b7bb6
43a79922ab5d3468f0e8614d526b693772d8b1d6
diff --git a/git-clone.sh b/git-clone.sh
index c09979a..8af0d5f 100755
--- a/git-clone.sh
+++ b/git-clone.sh
@@ -23,7 +23,7 @@ fi
 
 http_fetch () {
 	# $1 = Remote, $2 = Local
-	curl -nsfL $curl_extra_args "$1" >"$2"
+	curl -sfL --netrc-optional $curl_extra_args "$1" >"$2"
 }
 
 clone_dumb_http () {
diff --git a/git-fetch.sh b/git-fetch.sh
index 6586e77..e983cef 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -234,7 +234,7 @@ do
 	    $u =~ s{([^-a-zA-Z0-9/.])}{sprintf"%%%02x",ord($1)}eg;
 	    print "$u";
 	' "$remote_name")
-	head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted") &&
+	head=$(curl -sfL --netrc-optional $curl_extra_args "$remote/$remote_name_quoted") &&
 	expr "$head" : "$_x40\$" >/dev/null ||
 		die "Failed to fetch $remote_name from $remote"
 	echo >&2 Fetching "$remote_name from $remote" using http
diff --git a/git-ls-remote.sh b/git-ls-remote.sh
index f0f0b07..af8f4b1 100755
--- a/git-ls-remote.sh
+++ b/git-ls-remote.sh
@@ -42,7 +42,7 @@ http://* | https://* )
         if [ -n "$GIT_SSL_NO_VERIFY" ]; then
             curl_extra_args="-k"
         fi
-	curl -nsf $curl_extra_args "$peek_repo/info/refs" ||
+	curl -sf --netrc-optional $curl_extra_args "$peek_repo/info/refs" ||
 		echo "failed	slurping"
 	;;
 
---
0.99.9.GIT

^ permalink raw reply related

* What's in master tonight.
From: Junio C Hamano @ 2005-11-20  8:40 UTC (permalink / raw)
  To: git

I've merged http updates (mostly code refactoring and cleanups)
from Nick Hengeveld, config-set from Johannes Schindelin, and
most of user-relative paths series from Andreas Ericsson.
Cooking in proposed updates are the final part of user-relative
paths series that changes git-daemon, git:// proxy support from
Paul Collins, and repository format futureproofing from Martin
Atukunda.

I'd like to do the next 1.0rc when at least the repository
format futureproofing is ready.  I personally can live without
user-relative paths or git:// proxy, although both are probably
nice to have.  Here are the current status of these three
topics.

repository format futureproofing::

	I think the current code can copy template/config that
	was prepared for wrong version of repository format
	without complaining.  It should barf and fail.

        I am unsure if the check in setup_git_repository() is
        the right thing to do.  It doesn't check when $GIT_DIR
        environment is set, which is wrong; receive-pack and
        upload-pack are run with this environment set to ".".

	Although majority of important core programs do check
	the repository format before doing any harmful
	operations, some higher level scripts should be told to
	do the checking upfront.  The config-set command by
	Johannes is probably handy for this purpose.

user relative paths::

	What's left from the master is the part that touches the
	git-daemon.  We need to be careful about being strict
	while validating the path against whitelist _after_
	DWIM, so the version in the proposed updates need to be
	checked to make sure it is safe.

proxy for git:// transport:

	I do not have any pending issues on this patch, and I
	think it is ready to go in when somebody, preferably
	other than the original author, says it is useful and
	does not break things.

The master branch is fairly ahead of the last 1.0rc as of this
writing, and I'll be attending a wedding of a coworker, so there
will not be maint updates this weekend.

^ permalink raw reply

* HTTP basic authentication support
From: Kalle Valo @ 2005-11-20  8:38 UTC (permalink / raw)
  To: git

I keep some personal files in a git repository. Now I want to have the
repository in an HTTP server so that I can access it everywhere I go.
Since I don't want to share the repository with the whole world, I
would like to use the HTTP basic authentication, just to give a little
protection. But it seems that git doesn't support it, yet. Or did I miss
something?

I made a test repository which requires basic authentication. Login is
foo and password bar.

git clone doesn't work:

$ git clone http://foo:bar@www.valo.iki.fi/kalle/tmp/auth.git/ auth  
defaulting to local storage area
Cannot get remote repository information.
Perhaps git-update-server-info needs to be run there?
$ 

But curl works:

$ curl http://foo:bar@www.valo.iki.fi/kalle/tmp/auth.git/info/refs
4cb663bd2b92d57c5e1ba0bfa9bf65c2e50ff46a        refs/heads/master
$ 

I'm using git updated an hour ago.

-- 
Kalle Valo

^ permalink raw reply

* Re: [RFC] Applying a graft to a tree and "rippling" the changes through
From: Matthias Urlichs @ 2005-11-20  7:32 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <Pine.LNX.4.63.0511200217200.11653@wbgn013.biozentrum.uni-wuerzburg.de>

[-- Attachment #1: Type: text/plain, Size: 961 bytes --]

Hi,

Johannes Schindelin:
> Then, I'd merge the new development's HEAD, and it would be fine:
> 
Why not simply use info/grafts?

ORIG1 .. ORIG2 .. .. ORIG_HEAD
                            \\
                             GIT1 .. GIT2 .. .. GIT_HEAD

where the \\ link is the graft entry.

If we want (need, these days -- the history is so long that gitk draws
spurious lines becase of 16-bit window coordinate overflow) to chop off
history at some point, we can use the newfangled date parser + config
file stuff to set a sane default.

-- 
Matthias Urlichs   |   {M:U} IT Design @ m-u-it.de   |  smurf@smurf.noris.de
Disclaimer: The quote was selected randomly. Really. | http://smurf.noris.de
 - -
July 4.  Statistics show that we loose more fools on this day than in all the
other days of the year put together.  This proves, by the number left in stock,
that one Fourth of July per year is now inadequate, the country has grown so.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply

* Re: [PATCH] git-config-set: add more options
From: Junio C Hamano @ 2005-11-20  7:13 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <Pine.LNX.4.63.0511200650130.12832@wbgn013.biozentrum.uni-wuerzburg.de>

Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:

> 	The only thing I am concerned about now is how to deal with
> 	anti value_regex's, i.e.
>...
> 	Note: we could adjust the pattern syntax so that a prefix "!"
> 	means "no match", and "\!" means "match literal !", but this
> 	is ugly.

I do not think it is so bad, except that I would not even bother
doing the quoting of prefix '!'; the user can always say '[!]'
to mean a positive match that begins with an exclamation point.

^ permalink raw reply

* [PATCH] git-config-set: add more options
From: Johannes Schindelin @ 2005-11-20  5:52 UTC (permalink / raw)
  To: git, junkio

... namely

--replace-all, to replace any amount of matching lines, not just 0 or 1,
--get, to get the value of one key,
--get-all, the multivar version of --get, and
--unset-all, which deletes all matching lines from .git/config

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

---

	This patch is on top of my previous patches, because it is not
	a bug fix, but provides new features.

	Also, it extends t1300-config-set.sh to test these, and moves it 
	into t/...

	The only thing I am concerned about now is how to deal with
	anti value_regex's, i.e.

		[proxy]
			command=ssh for kernel.org
			command=rsh

	I cannot think of a POSIX regex which matches all values *not*
	containing " for " (like the second command), short of matching
	the exact value.

	Note: we could adjust the pattern syntax so that a prefix "!"
	means "no match", and "\!" means "match literal !", but this
	is ugly.

 Documentation/git-config-set.txt |   62 ++++++++++++++++++--
 cache.h                          |    3 -
 config-set.c                     |   92 +++++++++++++++++++++++++++++-
 config.c                         |  116 +++++++++++++++++++++++---------------
 t/t1300-config-set.sh            |   46 +++++++++++++++
 5 files changed, 258 insertions(+), 61 deletions(-)
diff --git a/Documentation/git-config-set.txt b/Documentation/git-config-set.txt
index 8e897be..c707fbc 100644
--- a/Documentation/git-config-set.txt
+++ b/Documentation/git-config-set.txt
@@ -8,12 +8,18 @@ git-config-set - Set options in .git/con
 
 SYNOPSIS
 --------
-'git-config-set' ( name [value [value_regex]] | --unset name [value_regex] )
+'git-config-set' name [value [value_regex]]
+'git-config-set' --replace-all name [value [value_regex]]
+'git-config-set' --get name [value_regex]
+'git-config-set' --get-all name [value_regex]
+'git-config-set' --unset name [value_regex]
+'git-config-set' --unset-all name [value_regex]
 
 DESCRIPTION
 -----------
-You can set/replace/unset options with this command. The name is actually
-the section and the key separated by a dot, and the value will be escaped.
+You can query/set/replace/unset options with this command. The name is
+actually the section and the key separated by a dot, and the value will be
+escaped.
 
 If you want to set/unset an option which can occor on multiple lines, you
 should provide a POSIX regex for the value.
@@ -31,8 +37,23 @@ This command will fail if
 OPTIONS
 -------
 
+--replace-all::
+	Default behaviour is to replace at most one line. This replaces
+	all lines matching the key (and optionally the value_regex)
+
+--get::
+	Get the value for a given key (optionally filtered by a regex
+	matching the value).
+
+--get-all::
+	Like get, but does not fail if the number of values for the key
+	is not exactly one.
+
 --unset::
-	Remove the given option from .git/config
+	Remove the line matching the key from .git/config.
+
+--unset-all::
+	Remove all matching lines from .git/config.
 
 
 EXAMPLE
@@ -84,14 +105,39 @@ To delete the entry for renames, do
 % git config-set --unset diff.renames
 ------------
 
-or just
+If you want to delete an entry for a multivar (like proxy.command above),
+you have to provide a regex matching the value of exactly one line.
+
+To query the value for a given key, do
 
 ------------
-% git config-set diff.renames
+% git config-set --get core.filemode
 ------------
 
-If you want to delete an entry for a multivar (like proxy.command above),
-you have to provide a regex matching the value of exactly one line.
+or
+
+------------
+% git config-set core.filemode
+------------
+
+or, to query a multivar:
+
+------------
+% git config-set --get proxy.command "for kernel.org$"
+------------
+
+If you want to know all the values for a multivar, do:
+
+------------
+% git config-set --get-all proxy.command
+------------
+
+If you like to live dangerous, you can replace *all* proxy.commands by a
+new one with
+
+------------
+% git config-set --replace-all proxy.command ssh
+------------
 
 
 Author
diff --git a/cache.h b/cache.h
index e2be3e7..a7c1bbd 100644
--- a/cache.h
+++ b/cache.h
@@ -192,7 +192,6 @@ extern int diff_rename_limit_default;
 
 /* Return a statically allocated filename matching the sha1 signature */
 extern char *mkpath(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
-extern char *enter_repo(char *path, int strict);
 extern char *git_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
 extern char *sha1_file_name(const unsigned char *sha1);
 extern char *sha1_pack_name(const unsigned char *sha1);
@@ -388,7 +387,7 @@ extern int git_config(config_fn_t fn);
 extern int git_config_int(const char *, const char *);
 extern int git_config_bool(const char *, const char *);
 extern int git_config_set(const char *, const char *);
-extern int git_config_set_multivar(const char *, const char *, const char *);
+extern int git_config_set_multivar(const char *, const char *, const char *, int);
 
 #define MAX_GITNAME (1000)
 extern char git_default_email[MAX_GITNAME];
diff --git a/config-set.c b/config-set.c
index 1b1547b..90a28b3 100644
--- a/config-set.c
+++ b/config-set.c
@@ -1,24 +1,106 @@
 #include "cache.h"
+#include <regex.h>
 
 static const char git_config_set_usage[] =
-"git-config-set name [value [value_regex]] | --unset name [value_regex]";
+"git-config-set [--get | --get-all | --replace-all | --unset | --unset-all] name [value [value_regex]]";
+
+static char* key = NULL;
+static char* value = NULL;
+static regex_t* regex = NULL;
+static int do_all = 0;
+static int seen = 0;
+
+static int show_config(const char* key_, const char* value_)
+{
+	if (!strcmp(key_, key) &&
+			(regex == NULL ||
+			 !regexec(regex, value_, 0, NULL, 0))) {
+		if (do_all) {
+			printf("%s\n", value_);
+			return 0;
+		}
+		if (seen > 0) {
+			fprintf(stderr, "More than one value: %s\n", value);
+			free(value);
+		}
+		value = strdup(value_);
+		seen++;
+	}
+	return 0;
+}
+
+static int get_value(const char* key_, const char* regex_)
+{
+	int i;
+
+	key = malloc(strlen(key_)+1);
+	for (i = 0; key_[i]; i++)
+		key[i] = tolower(key_[i]);
+
+	if (regex_) {
+		regex = (regex_t*)malloc(sizeof(regex_t));
+		if (regcomp(regex, regex_, REG_EXTENDED)) {
+			fprintf(stderr, "Invalid pattern: %s\n", regex_);
+			return -1;
+		}
+	}
+
+	i = git_config(show_config);
+	if (value) {
+		printf("%s\n", value);
+		free(value);
+	}
+	free(key);
+	if (regex) {
+		regfree(regex);
+		free(regex);
+	}
+
+	if (do_all)
+		return 0;
+
+	return seen == 1 ? 0 : 1;
+}
 
 int main(int argc, const char **argv)
 {
 	setup_git_directory();
 	switch (argc) {
 	case 2:
-		return git_config_set(argv[1], NULL);
+		return get_value(argv[1], NULL);
 	case 3:
 		if (!strcmp(argv[1], "--unset"))
 			return git_config_set(argv[2], NULL);
-		else
+		else if (!strcmp(argv[1], "--unset-all"))
+			return git_config_set_multivar(argv[2], NULL, NULL, 1);
+		else if (!strcmp(argv[1], "--get"))
+			return get_value(argv[2], NULL);
+		else if (!strcmp(argv[1], "--get-all")) {
+			do_all = 1;
+			return get_value(argv[2], NULL);
+		} else
+
 			return git_config_set(argv[1], argv[2]);
 	case 4:
 		if (!strcmp(argv[1], "--unset"))
-			return git_config_set_multivar(argv[2], NULL, argv[3]);
+			return git_config_set_multivar(argv[2], NULL, argv[3], 0);
+		else if (!strcmp(argv[1], "--unset-all"))
+			return git_config_set_multivar(argv[2], NULL, argv[3], 1);
+		else if (!strcmp(argv[1], "--get"))
+			return get_value(argv[2], argv[3]);
+		else if (!strcmp(argv[1], "--get-all")) {
+			do_all = 1;
+			return get_value(argv[2], argv[3]);
+		} else if (!strcmp(argv[1], "--replace-all"))
+
+			return git_config_set_multivar(argv[2], argv[3], NULL, 1);
 		else
-			return git_config_set_multivar(argv[1], argv[2], argv[3]);
+
+			return git_config_set_multivar(argv[1], argv[2], argv[3], 0);
+	case 5:
+		if (!strcmp(argv[1], "--replace-all"))
+			return git_config_set_multivar(argv[2], argv[3], argv[4], 1);
+	case 1:
 	default:
 		usage(git_config_set_usage);
 	}
diff --git a/config.c b/config.c
index bbcafff..697d79f 100644
--- a/config.c
+++ b/config.c
@@ -263,11 +263,15 @@ int git_config(config_fn_t fn)
 /*
  * Find all the stuff for git_config_set() below.
  */
+
+#define MAX_MATCHES 512
+
 static struct {
 	int baselen;
 	char* key;
 	regex_t* value_regex;
-	off_t offset;
+	int multi_replace;
+	off_t offset[MAX_MATCHES];
 	enum { START, SECTION_SEEN, SECTION_END_SEEN, KEY_SEEN } state;
 	int seen;
 } store;
@@ -279,12 +283,16 @@ static int store_aux(const char* key, co
 		if (!strcmp(key, store.key) &&
 				(store.value_regex == NULL ||
 				!regexec(store.value_regex, value, 0, NULL, 0))) {
-			if (store.seen == 1) {
+			if (store.seen == 1 && store.multi_replace == 0) {
 				fprintf(stderr,
 					"Warning: %s has multiple values\n",
 					key);
+			} else if (store.seen >= MAX_MATCHES) {
+				fprintf(stderr, "Too many matches\n");
+				return 1;
 			}
-			store.offset = ftell(config_file);
+
+			store.offset[store.seen] = ftell(config_file);
 			store.seen++;
 		}
 		break;
@@ -293,14 +301,15 @@ static int store_aux(const char* key, co
 			store.state = SECTION_END_SEEN;
 			break;
 		} else
-			store.offset = ftell(config_file);
+			/* do not increment matches: this is no match */
+			store.offset[store.seen] = ftell(config_file);
 		/* fallthru */
 	case SECTION_END_SEEN:
 	case START:
 		if (!strcmp(key, store.key) &&
 				(store.value_regex == NULL ||
 				!regexec(store.value_regex, value, 0, NULL, 0))) {
-			store.offset = ftell(config_file);
+			store.offset[store.seen] = ftell(config_file);
 			store.state = KEY_SEEN;
 			store.seen++;
 		} else if(!strncmp(key, store.key, store.baselen))
@@ -334,14 +343,38 @@ static void store_write_pair(int fd, con
 	write(fd, "\n", 1);
 }
 
+static int find_beginning_of_line(const char* contents, int size,
+	int offset_, int* found_bracket)
+{
+	int equal_offset = size, bracket_offset = size;
+	int offset;
+
+	for (offset = offset_-2; offset > 0 
+			&& contents[offset] != '\n'; offset--)
+		switch (contents[offset]) {
+			case '=': equal_offset = offset; break;
+			case ']': bracket_offset = offset; break;
+		}
+	if (bracket_offset < equal_offset) {
+		*found_bracket = 1;
+		offset = bracket_offset+1;
+	} else
+		offset++;
+
+	return offset;
+}
+
 int git_config_set(const char* key, const char* value)
 {
-	return git_config_set_multivar(key, value, NULL);
+	return git_config_set_multivar(key, value, NULL, 0);
 }
 
 /*
  * If value==NULL, unset in (remove from) config,
  * if value_regex!=NULL, disregard key/value pairs where value does not match.
+ * if multi_replace==0, nothing, or only one matching key/value is replaced,
+ *     else all matching key/values (regardless how many) are removed,
+ *     before the new pair is written.
  *
  * Returns 0 on success.
  *
@@ -360,7 +393,7 @@ int git_config_set(const char* key, cons
  *
  */
 int git_config_set_multivar(const char* key, const char* value,
-	const char* value_regex)
+	const char* value_regex, int multi_replace)
 {
 	int i;
 	struct stat st;
@@ -368,6 +401,8 @@ int git_config_set_multivar(const char* 
 	char* config_file = strdup(git_path("config"));
 	char* lock_file = strdup(git_path("config.lock"));
 
+	store.multi_replace = multi_replace;
+
 	/*
 	 * Since "key" actually contains the section name and the real
 	 * key name separated by a dot, we have to know where the dot is.
@@ -431,7 +466,7 @@ int git_config_set_multivar(const char* 
 	} else{
 		int in_fd;
 		char* contents;
-		int offset, new_line = 0;
+		int i, copy_begin, copy_end, new_line = 0;
 
 		if (value_regex == NULL)
 			store.value_regex = NULL;
@@ -446,7 +481,7 @@ int git_config_set_multivar(const char* 
 			}
 		}
 
-		store.offset = 0;
+		store.offset[0] = 0;
 		store.state = START;
 		store.seen = 0;
 
@@ -472,52 +507,42 @@ int git_config_set_multivar(const char* 
 			free(store.value_regex);
 		}
 
-		/* if nothing to unset, error out */
-		if (store.seen == 0 && value == NULL) {
+		/* if nothing to unset, or too many matches, error out */
+		if ((store.seen == 0 && value == NULL) ||
+				(store.seen > 1 && multi_replace == 0)) {
 			close(fd);
 			unlink(lock_file);
 			return 5;
 		}
 
-		store.key = (char*)key;
-
 		in_fd = open(config_file, O_RDONLY, 0666);
 		contents = mmap(NULL, st.st_size, PROT_READ,
 			MAP_PRIVATE, in_fd, 0);
 		close(in_fd);
 
-		if (store.offset == 0) {
-			store.offset = offset = st.st_size;
-		} else if (store.state != KEY_SEEN) {
-			offset = store.offset;
-		} else {
-			int equal_offset = st.st_size,
-				bracket_offset = st.st_size;
-
-			if (value == NULL && store.seen > 1) {
-				fprintf(stderr, "Cannot remove multivar (%s has %d values\n", key, store.seen);
-				close(fd);
-				unlink(lock_file);
-				return 7;
-			}
-			for (offset = store.offset-2; offset > 0 
-					&& contents[offset] != '\n'; offset--)
-				switch (contents[offset]) {
-				case '=': equal_offset = offset; break;
-				case ']': bracket_offset = offset; break;
-				}
-			if (bracket_offset < equal_offset) {
-				new_line = 1;
-				offset = bracket_offset+1;
+		if (store.seen == 0)
+			store.seen = 1;
+
+		for (i = 0, copy_begin = 0; i < store.seen; i++) {
+			if (store.offset[i] == 0) {
+				store.offset[i] = copy_end = st.st_size;
+			} else if (store.state != KEY_SEEN) {
+				copy_end = store.offset[i];
 			} else
-				offset++;
+				copy_end = find_beginning_of_line(
+					contents, st.st_size,
+					store.offset[i]-2, &new_line);
+
+			/* write the first part of the config */
+			if (copy_end > copy_begin) {
+				write(fd, contents + copy_begin,
+				copy_end - copy_begin);
+				if (new_line)
+					write(fd, "\n", 1);
+			}
+			copy_begin = store.offset[i];
 		}
 
-		/* write the first part of the config */
-		write(fd, contents, offset);
-		if (new_line)
-			write(fd, "\n", 1);
-
 		/* write the pair (value == NULL means unset) */
 		if (value != NULL) {
 			if (store.state == START)
@@ -526,9 +551,9 @@ int git_config_set_multivar(const char* 
 		}
 
 		/* write the rest of the config */
-		if (store.offset < st.st_size)
-			write(fd, contents + store.offset,
-				st.st_size - store.offset);
+		if (copy_begin < st.st_size)
+			write(fd, contents + copy_begin,
+				st.st_size - copy_begin);
 
 		munmap(contents, st.st_size);
 		unlink(config_file);
@@ -544,3 +569,4 @@ int git_config_set_multivar(const char* 
 	return 0;
 }
 
+
diff --git a/t1300-config-set.sh b/t/t1300-config-set.sh
similarity index 100%
rename from t1300-config-set.sh
rename to t/t1300-config-set.sh
index df89216..717bf4d 100644
--- a/t1300-config-set.sh
+++ b/t/t1300-config-set.sh
@@ -76,9 +76,44 @@ noIndent= sillyValue ; 'nother silly com
 # empty line
 		; comment
 		haha   ="beta" # last silly comment
+haha = hello
+	haha = bello
 [nextSection] noNewline = ouch
 EOF
 
+cp .git/config .git/config2
+
+test_expect_success 'multiple unset' \
+	'git-config-set --unset-all beta.haha'
+
+cat > expect << EOF
+[beta] ; silly comment # another comment
+noIndent= sillyValue ; 'nother silly comment
+
+# empty line
+		; comment
+[nextSection] noNewline = ouch
+EOF
+
+test_expect_success 'multiple unset is correct' 'cmp .git/config expect'
+
+mv .git/config2 .git/config
+
+test_expect_success '--replace-all' \
+	'git-config-set --replace-all beta.haha gamma'
+
+cat > expect << EOF
+[beta] ; silly comment # another comment
+noIndent= sillyValue ; 'nother silly comment
+
+# empty line
+		; comment
+	haha = gamma
+[nextSection] noNewline = ouch
+EOF
+
+test_expect_success 'all replaced' 'cmp .git/config expect'
+
 git-config-set beta.haha alpha
 
 cat > expect << EOF
@@ -108,7 +143,8 @@ EOF
 
 test_expect_success 'really really mean test' 'cmp .git/config expect'
 
-git-config-set beta.haha
+test_expect_success 'get value' 'test alpha = $(git-config-set beta.haha)'
+git-config-set --unset beta.haha
 
 cat > expect << EOF
 [beta] ; silly comment # another comment
@@ -137,6 +173,12 @@ EOF
 
 test_expect_success 'multivar' 'cmp .git/config expect'
 
+test_expect_failure 'ambiguous get' \
+	'git-config-set --get nextsection.nonewline'
+
+test_expect_success 'get multivar' \
+	'git-config-set --get-all nextsection.nonewline'
+
 git-config-set nextsection.nonewline "wow3" "wow$"
 
 cat > expect << EOF
@@ -152,6 +194,8 @@ EOF
 
 test_expect_success 'multivar replace' 'cmp .git/config expect'
 
+test_expect_failure 'ambiguous value' 'git-config-set nextsection.nonewline'
+
 test_expect_failure 'ambiguous unset' \
 	'git-config-set --unset nextsection.nonewline'
 

^ permalink raw reply related

* [PATCH] merge-recursive::removeFile: remove empty directories
From: Junio C Hamano @ 2005-11-20  4:14 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Christoph Hellwig, Paul Mackerras, linuxppc64-dev,
	Git Mailing List, Fredrik Kuivinen
In-Reply-To: <Pine.LNX.4.64.0511190957320.13959@g5.osdl.org>

When the last file in a directory is removed as the result of a
merge, try to rmdir the now-empty directory.

Signed-off-by: Junio C Hamano <junkio@cox.net>

---

 And this is the one for 'git pull -s recursive' which is the
 default these days.

 git-merge-recursive.py |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

applies-to: ea62f7003bb2769fa23d5ca371d84cee9d2ec46f
80e21a9ed809d98788ff6fb705d911bee37d460b
diff --git a/git-merge-recursive.py b/git-merge-recursive.py
index d7d36aa..37258ad 100755
--- a/git-merge-recursive.py
+++ b/git-merge-recursive.py
@@ -293,6 +293,10 @@ def removeFile(clean, path):
         except OSError, e:
             if e.errno != errno.ENOENT and e.errno != errno.EISDIR:
                 raise
+        try:
+            os.removedirs(os.path.dirname(path))
+        except:
+            pass
 
 def uniquePath(path, branch):
     def fileExists(path):
---
0.99.9.GIT

^ permalink raw reply related

* [PATCH] merge-one-file: remove empty directories
From: Junio C Hamano @ 2005-11-20  4:14 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Christoph Hellwig, Paul Mackerras, linuxppc64-dev,
	Git Mailing List, Fredrik Kuivinen
In-Reply-To: <Pine.LNX.4.64.0511190957320.13959@g5.osdl.org>

When the last file in a directory is removed as the result of a
merge, try to rmdir the now-empty directory.

[jc: We probably could use "rmdir -p", but for now we do that by
hand for portability.]

Signed-off-by: Junio C Hamano <junkio@cox.net>

---
    Linus Torvalds <torvalds@osdl.org> writes:

    > [ Junio, Fredrik, you're cc'd because the "merge-one-file" logic doesn't 
    >   clean up empty directories after removing a file in merge ]

    Here is the one for merge-one-file that is used by 'git pull
    -s resolve'.  Next patch will be the merge-recursive one.

 git-merge-one-file.sh |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

applies-to: fbe4060a1b8ba894be5767ffc27402f94f356882
397c76697f898e0341699fba8ef783f3342329c7
diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh
index b08597d..b285990 100755
--- a/git-merge-one-file.sh
+++ b/git-merge-one-file.sh
@@ -25,7 +25,12 @@ case "${1:-.}${2:-.}${3:-.}" in
 		echo "Removing $4"
 	fi
 	if test -f "$4"; then
-		rm -f -- "$4"
+		rm -f -- "$4" &&
+		dn="$4" &&
+		while dn=$(expr "$dn" : '\(.*\)/') && rmdir "$dn" 2>/dev/null
+		do
+			:;
+		done
 	fi &&
 		exec git-update-index --remove -- "$4"
 	;;
---
0.99.9.GIT

^ permalink raw reply related

* Re: Rss produced by git is not valid xml?
From: Johannes Schindelin @ 2005-11-20  4:13 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, git
In-Reply-To: <Pine.LNX.4.64.0511191901560.13959@g5.osdl.org>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 505 bytes --]

Hi,

On Sat, 19 Nov 2005, Linus Torvalds wrote:

> (In Finnish/Swedish, the letter 'ä' is code \x00E4, which in UTF-8 is the 
> sequence \xA5\xC3. But you can't know if a text that has that sequence is 
> UTF-8, or if it's a strange two-character latin1 sequence of "Ã¥" 
> (character codes \x00A5 and \x00C3).
> 
> But I can pretty much guarantee that most any _sane_ latin1 text will 
> obviously not be UTF-8, so in _practice_ you can definitely tell the two 
> apart.

Thank you,
Dscho

^ permalink raw reply

* Re: Rss produced by git is not valid xml?
From: Linus Torvalds @ 2005-11-20  3:10 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: Junio C Hamano, git
In-Reply-To: <Pine.LNX.4.63.0511200215480.11653@wbgn013.biozentrum.uni-wuerzburg.de>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 855 bytes --]



On Sun, 20 Nov 2005, Johannes Schindelin wrote:
> 
> On Sat, 19 Nov 2005, Linus Torvalds wrote:
> >
> > And text with 8-bit latin1 is almost never valid utf-8. 
> 
> I had the impression utf-8 was designed in a way so you could strike 
> "almost". But I don't have my docs handy...

No, strange latin combinations will be valid utf-8. 

It needs to be some really strange text to be real latin1 but look like it 
might be utf-8, though.

(In Finnish/Swedish, the letter 'ä' is code \x00E4, which in UTF-8 is the 
sequence \xA5\xC3. But you can't know if a text that has that sequence is 
UTF-8, or if it's a strange two-character latin1 sequence of "Ã¥" 
(character codes \x00A5 and \x00C3).

But I can pretty much guarantee that most any _sane_ latin1 text will 
obviously not be UTF-8, so in _practice_ you can definitely tell the two 
apart.

		Linus

^ permalink raw reply

* Re: what is "rebase"?
From: Andreas Ericsson @ 2005-11-20  2:12 UTC (permalink / raw)
  To: Randal L. Schwartz; +Cc: Johannes Schindelin, git
In-Reply-To: <86psow6pxl.fsf@blue.stonehenge.com>

Randal L. Schwartz wrote:
> Is this what I would use if I want to discard history except for
> major milestones?
> 

No.

> Still not sure what "cherry-pick" is either. And that's *not*
> in the glossary. :)
> 

man git-cherry-pick

> I'm just worried about my archive getting bigger and bigger and
> having lots of junk in it that I can't get rid of.
> 

If you do experimental development on a branch and want to throw stuff 
away (commits, tags, whatnot), you should run "git-reset". It can bring 
any combination of index and working tree back to any commit in the 
history of that branch.

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231

^ permalink raw reply

* Re: still unclear on setting up a repository
From: Andreas Ericsson @ 2005-11-20  2:10 UTC (permalink / raw)
  To: Randal L. Schwartz; +Cc: git
In-Reply-To: <86y83k6ry0.fsf@blue.stonehenge.com>

Randal L. Schwartz wrote:
>>>And then, another "go-boom" problem:
>>>% cg-fetch
>>>Hard links don't work - using copy
>>>Fetching head...
>>>cp: illegal option -- d
> 
> 
> Andreas> I think this was resolved some weeks ago. Perhaps you could try the
> Andreas> latest cogito from git://git.kernel.org/pub/scm/cogito/cogito.git ?
> 
> I'm grabbing nearly hourly.
> 
>     localhost:~/MIRROR/cogito-GIT % cg-status
>     Heads:
>        >master      22ff47e9b3c5fc8aa2efbc5ac8690b06b868ef6f
>       R origin      22ff47e9b3c5fc8aa2efbc5ac8690b06b868ef6f
> 
> Error with this version.
> 

You're right. It was the '-b' option that was removed earlier (which you 
reported as well, ten days ago).

> Andreas> As for rsync; From the output you posted above, you were setting up
> Andreas> both the repositories on your local machine. Using rsync for those
> Andreas> cases would be pretty stupid.
> 
> rsync instead of cp if you really need "-d".
> 

There are other problems with rsync. It would actually be faster to use 
the git-daemon on localhost than using rsync for operations between two 
local repositories.

> Andreas> On a side-note, could you please turn off your spamvertising
> Andreas> auto-reply? It sends me some info about your perl-expertise and
> Andreas> contact-numbers every now and then. It's getting a bit annoying.
> 
> If you email me directly, you'll get that note no more than once per
> month.  Some day, I'll create a system to whitelist people that never
> want to see it again.  Damn TUIT shortage. :)
> 

It's not the amount of mail that annoys me. It's the principle of the 
thing. Perhaps you can use a different email when participating in list 
discussions? It's not exactly right to ask others to tell you they don't 
want your spam after all.

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231

^ permalink raw reply

* Re: what is "rebase"?
From: Randal L. Schwartz @ 2005-11-20  2:10 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <86psow6pxl.fsf@blue.stonehenge.com>

>>>>> "Randal" == Randal L Schwartz <merlyn@stonehenge.com> writes:

Randal> Well, I got what I wanted... someone pointing me to a simple explanation.
Randal> However, I'm still lost.  When would I do this, and what will the
Randal> effect be?

Nevermind.  Found rebase-from-internal.txt.

I understand much better now.

-- 
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

^ permalink raw reply

* Re: what is "rebase"?
From: Randal L. Schwartz @ 2005-11-20  1:58 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <Pine.LNX.4.63.0511200214280.11653@wbgn013.biozentrum.uni-wuerzburg.de>

>>>>> "Johannes" == Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:

Johannes> How about the definition in Documentation/glossary.txt?

>> rebase::
>> To clean a branch by starting from the head of the main line of
>> development ("master"), and reapply the (possibly cherry-picked)
>> changes from that branch.

Well, I got what I wanted... someone pointing me to a simple explanation.
However, I'm still lost.  When would I do this, and what will the
effect be?

Is this what I would use if I want to discard history except for
major milestones?  Like if I had:

        A - edit - edit - edit - B - edit - edit - edit - C

and I wanted to really just retain:

        A - B - C

Or is this just to make it look like:

        C

Still not sure what "cherry-pick" is either. And that's *not*
in the glossary. :)

I'm just worried about my archive getting bigger and bigger and
having lots of junk in it that I can't get rid of.

-- 
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

^ permalink raw reply

* Re: [RFC] Applying a graft to a tree and "rippling" the changes through
From: Johannes Schindelin @ 2005-11-20  1:24 UTC (permalink / raw)
  To: Matthias Urlichs; +Cc: git
In-Reply-To: <pan.2005.11.19.17.23.17.920228@smurf.noris.de>

Hi,

On Sat, 19 Nov 2005, Matthias Urlichs wrote:

> [...] What can you do with such a thing that you cannot do now, just as 
> easily, besides slow down your programs with an unnecessary level of 
> indirection?

I tend to agree. In fact, if I would like to introduce earlier history 
(for the sake of archeology or whatever), I would import the earlier 
history into git, possibly finding the best match in the current 
development branch (for example, when the original project continued for a 
while to be tracked in CVS), and then make a merge between these two.

Then, I'd merge the new development's HEAD, and it would be fine:

ORIG1 .. ORIG2 .. .. ORIG_HEAD
                         |
                         |   GIT1 .. GIT2 .. .. GIT_HEAD
                         |   /                    /
                         | /                     /
                      UNIFYING_MERGE           /
                                   \         /
                                     \     /
                               NEW_HEAD_FOR_ARCHEOLOGICAL_PURPOSES

Where ORIG_HEAD's tree is identical with GIT1's tree. The resulting branch 
would serve every research purpose I can think of (just be sure not to 
use "-m" with git-whatchanged).

Ciao,
Dscho

^ 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