On Thu, 2005-04-14 at 08:55 +0200, Martin Schlemmer wrote: > On Thu, 2005-04-14 at 00:19 +0200, Petr Baudis wrote: > > Dear diary, on Wed, Apr 13, 2005 at 02:15:37PM CEST, I got a letter > > where Martin Schlemmer <[EMAIL PROTECTED]> told me that... > > > On Wed, 2005-04-13 at 11:26 +0200, Petr Baudis wrote: > > >> > Dear diary, on Wed, Apr 13, 2005 at 10:41:12AM CEST, I got a letter > > > > where Martin Schlemmer <[EMAIL PROTECTED]> told me that... > > > > > On Wed, 2005-04-13 at 09:54 +0200, Petr Baudis wrote: > > > > > PS: not having looked deeper yet, why does fsck-cache always find > > > > > unreferenced blobs/commits (no matter what tree is tracked, they stay > > > > > the same) ? And trying to remove them leads to more, which leads to > > > > > an > > > > > empty .git/opjects/ =) Also, leading to this, will adding an option > > > > > to > > > > > remove disconnected commits/blobs from local commits (that was > > > > > disconnected with a pull) be a viable option to add? > > > > > > > > fsck-cache is concerned only by the objects database, so all the HEADs > > > > are unreferenced commits too. This is a right thing, the HEAD tracking > > > > should stay purely in the scripts - if we want to make fsck-cache > > > > smarter about that, we should implement git fsck or something. > > > > > > > > Killing unreferenced blobs should be safe, I think. > > > > > > > > > First, about the 'git diff' thing I asked yesterday .. what I meant, > > > > > was > > > > > should it actually output this: > > > > > > > > > > ---- > > > > > COPYING: fe2a4177a760fd110e78788734f167bd633be8de 33 > > > > > Makefile: 929aa49a3dbe683ad52094099797bc636a7949a6 33 > > > > > README: 46c6a9ea48ddd1dda45ca585f49975a6869ffe51 33 > > > > > ... > > > > > ---- > > > > > > > > > > Shouldn't it just show actual changes? > > > > > > > > This is an actual change. It's just that it's a change to metadata > > > > (somewhat esotherically described by the "33"), not the file contents. > > > > > > > > BTW, git diff does actually something completely different from git diff > > > > with any arguments. It diffs to the directory cache, not to any tree! It > > > > just wraps show-diff, which has also a different output format (not > > > > outputting "git diffs"). The worst thing is that it requires a different > > > > -p option to apply. Someone should purge this wart, I think. > > > > > > > > > > Check applied patch (also in the new output). > > > > Please send patches inline and properly signed off. > > > > The new evo have a bad habit of screwing the tabs, but sure. > > > > > > Also on the same note .. should 'git ci' without listed files to be > > > > > committed, really add a reference to all files as it currently do in > > > > > the > > > > > commit/blob/whatever info, instead of just the changed/added files > > > > > (see > > > > > the git-seperate-dir.patch you have not yet commented on for > > > > > reference)? > > > > > > > > ... > > > > > > > > > > Patch will also resolve this. > > > > Your patch is bad - it removes the pure metadata changes, but you > > definitively do not want to do that! If you are annoyed by meaningless > > time changes etc, do update-cache --refresh. Ignoring mode changes is a > > pure disaster. > > > > Ahh - and there was light. I do not have a problem with the mode > changes - its just _all_ files was shown after tracked branch was > changed. How about below patch? > > > > > > I know its in its infancy, but I am not sure on what scm you are > > > > > basing > > > > > it, so not sure how things should behave. > > > > > > > > I'm trying to base it on common sense and principle of least surprise. > > > > :-) > > > > > > > > > > Ok, I'll just bug you then if I am not sure on how you want something ;p > > > > Or do it somehow and I'll bug you back if I don't like it. ;-) > > > > Ditto > > > ---- > > Normalize show-diff output and make sure we only show real changes after > changing the tracked branch. > > Signed-off-by: Martin Schlemmer <[EMAIL PROTECTED]> >
Ok, so I forgot to pull, and missed gitcancel.sh being added.
How about this one? (One attached in case evo is brain dead and mangles
the tabs)
----
Normalize show-diff output, add --update-modes target to update-cache,
and make sure we only show real changes after changing the tracked
branch, as well as update the file modes according to the cache.
Signed-off-by: Martin Schlemmer <[EMAIL PROTECTED]>
gitcancel.sh: ec58f7444a42cd3cbaae919fc68c70a3866420c0
--- gitcancel.sh
+++ gitcancel.sh 2005-04-14 10:26:49.000000000 +0200
@@ -12,7 +12,7 @@
# FIXME: Does not revert mode changes!
-show-diff | patch -p0 -R
+show-diff | patch -p1 -R
rm -f .git/add-queue .git/rm-queue .git/merged
update-cache --refresh
gittrack.sh: 03d6db1fb3a70605ef249c632c04e542457f0808
--- gittrack.sh
+++ gittrack.sh 2005-04-14 10:26:49.000000000 +0200
@@ -51,6 +51,8 @@
read-tree $(tree-id "$name")
gitdiff.sh local "$name" | gitapply.sh
+ # --update-modes need to be before --refresh
+ update-cache --update-modes --refresh
else
[ "$tracking" ] || \
@@ -61,6 +63,8 @@
if [ -s ".git/HEAD.local" ]; then
gitdiff.sh "$tracking" local | gitapply.sh
read-tree $(tree-id local)
+ # --update-modes need to be before --refresh
+ update-cache --update-modes --refresh
head=$(cat .git/HEAD)
branchhead=$(cat .git/heads/$tracking)
show-diff.c: a531ca4078525d1c8dcf84aae0bfa89fed6e5d96
--- show-diff.c
+++ show-diff.c 2005-04-14 10:26:49.000000000 +0200
@@ -5,13 +5,18 @@
*/
#include "cache.h"
-static void show_differences(char *name,
+static void show_differences(struct cache_entry *ce,
void *old_contents, unsigned long long old_size)
{
static char cmd[1000];
+ static char sha1[41];
+ int n;
FILE *f;
- snprintf(cmd, sizeof(cmd), "diff -L %s -u -N - %s", name, name);
+ for (n = 0; n < 20; n++)
+ snprintf(&(sha1[n*2]), 3, "%02x", ce->sha1[n]);
+ snprintf(cmd, sizeof(cmd), "diff -L %s/%s -L uncommitted/%s -u -N -
%s",
+ sha1, ce->name, ce->name, ce->name);
f = popen(cmd, "w");
if (old_size)
fwrite(old_contents, old_size, 1, f);
@@ -99,7 +104,7 @@
continue;
new = read_sha1_file(ce->sha1, type, &size);
- show_differences(ce->name, new, size);
+ show_differences(ce, new, size);
free(new);
}
return 0;
update-cache.c: 62d0a6c41560d40863c44599355af10d9e089312
--- update-cache.c
+++ update-cache.c 2005-04-14 10:27:07.000000000 +0200
@@ -210,6 +210,39 @@
}
}
+static struct cache_entry *update_file_mode(struct cache_entry *ce)
+{
+ struct stat st;
+ int changed;
+
+ if (stat(ce->name, &st) < 0)
+ return NULL;
+
+ changed = cache_match_stat(ce, &st);
+ if (!changed)
+ return ce;
+
+ if (changed & MODE_CHANGED)
+ if (chmod(ce->name, ce->st_mode))
+ return NULL;
+
+ return ce;
+}
+
+static void update_modes(void)
+{
+ int i;
+
+ for (i = 0; i < active_nr; i++) {
+ struct cache_entry *ce = active_cache[i];
+
+ if (!update_file_mode(ce)) {
+ printf("%s: needs update\n", ce->name);
+ continue;
+ }
+ }
+}
+
/*
* We fundamentally don't like some paths: we don't want
* dot or dot-dot anywhere, and in fact, we don't even want
@@ -282,6 +315,10 @@
refresh_cache();
continue;
}
+ if (!strcmp(path, "--update-modes")) {
+ update_modes();
+ continue;
+ }
die("unknown option %s", path);
}
if (!verify_path(path)) {
--
Martin Schlemmer
gitcancel.sh: ec58f7444a42cd3cbaae919fc68c70a3866420c0
--- gitcancel.sh
+++ gitcancel.sh 2005-04-14 10:26:49.000000000 +0200
@@ -12,7 +12,7 @@
# FIXME: Does not revert mode changes!
-show-diff | patch -p0 -R
+show-diff | patch -p1 -R
rm -f .git/add-queue .git/rm-queue .git/merged
update-cache --refresh
gittrack.sh: 03d6db1fb3a70605ef249c632c04e542457f0808
--- gittrack.sh
+++ gittrack.sh 2005-04-14 10:26:49.000000000 +0200
@@ -51,6 +51,8 @@
read-tree $(tree-id "$name")
gitdiff.sh local "$name" | gitapply.sh
+ # --update-modes need to be before --refresh
+ update-cache --update-modes --refresh
else
[ "$tracking" ] || \
@@ -61,6 +63,8 @@
if [ -s ".git/HEAD.local" ]; then
gitdiff.sh "$tracking" local | gitapply.sh
read-tree $(tree-id local)
+ # --update-modes need to be before --refresh
+ update-cache --update-modes --refresh
head=$(cat .git/HEAD)
branchhead=$(cat .git/heads/$tracking)
show-diff.c: a531ca4078525d1c8dcf84aae0bfa89fed6e5d96
--- show-diff.c
+++ show-diff.c 2005-04-14 10:26:49.000000000 +0200
@@ -5,13 +5,18 @@
*/
#include "cache.h"
-static void show_differences(char *name,
+static void show_differences(struct cache_entry *ce,
void *old_contents, unsigned long long old_size)
{
static char cmd[1000];
+ static char sha1[41];
+ int n;
FILE *f;
- snprintf(cmd, sizeof(cmd), "diff -L %s -u -N - %s", name, name);
+ for (n = 0; n < 20; n++)
+ snprintf(&(sha1[n*2]), 3, "%02x", ce->sha1[n]);
+ snprintf(cmd, sizeof(cmd), "diff -L %s/%s -L uncommitted/%s -u -N - %s",
+ sha1, ce->name, ce->name, ce->name);
f = popen(cmd, "w");
if (old_size)
fwrite(old_contents, old_size, 1, f);
@@ -99,7 +104,7 @@
continue;
new = read_sha1_file(ce->sha1, type, &size);
- show_differences(ce->name, new, size);
+ show_differences(ce, new, size);
free(new);
}
return 0;
update-cache.c: 62d0a6c41560d40863c44599355af10d9e089312
--- update-cache.c
+++ update-cache.c 2005-04-14 10:27:07.000000000 +0200
@@ -210,6 +210,39 @@
}
}
+static struct cache_entry *update_file_mode(struct cache_entry *ce)
+{
+ struct stat st;
+ int changed;
+
+ if (stat(ce->name, &st) < 0)
+ return NULL;
+
+ changed = cache_match_stat(ce, &st);
+ if (!changed)
+ return ce;
+
+ if (changed & MODE_CHANGED)
+ if (chmod(ce->name, ce->st_mode))
+ return NULL;
+
+ return ce;
+}
+
+static void update_modes(void)
+{
+ int i;
+
+ for (i = 0; i < active_nr; i++) {
+ struct cache_entry *ce = active_cache[i];
+
+ if (!update_file_mode(ce)) {
+ printf("%s: needs update\n", ce->name);
+ continue;
+ }
+ }
+}
+
/*
* We fundamentally don't like some paths: we don't want
* dot or dot-dot anywhere, and in fact, we don't even want
@@ -282,6 +315,10 @@
refresh_cache();
continue;
}
+ if (!strcmp(path, "--update-modes")) {
+ update_modes();
+ continue;
+ }
die("unknown option %s", path);
}
if (!verify_path(path)) {
signature.asc
Description: This is a digitally signed message part

