Skip to content

Commit

Permalink
Merge branch 'jc/fix-diff-files-unmerged'
Browse files Browse the repository at this point in the history
* jc/fix-diff-files-unmerged:
  diff-files: show unmerged entries correctly
  diff: remove often unused parameters from diff_unmerge()
  diff.c: return filepair from diff_unmerge()
  test: use $_z40 from test-lib
  • Loading branch information
gitster committed May 6, 2011
2 parents 6c252ef + 095ce95 commit 22dbeee
Show file tree
Hide file tree
Showing 16 changed files with 120 additions and 36 deletions.
15 changes: 11 additions & 4 deletions diff-lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ int run_diff_files(struct rev_info *revs, unsigned int option)

if (ce_stage(ce)) {
struct combine_diff_path *dpath;
struct diff_filepair *pair;
unsigned int wt_mode = 0;
int num_compare_stages = 0;
size_t path_len;

Expand All @@ -130,15 +132,17 @@ int run_diff_files(struct rev_info *revs, unsigned int option)

changed = check_removed(ce, &st);
if (!changed)
dpath->mode = ce_mode_from_stat(ce, st.st_mode);
wt_mode = ce_mode_from_stat(ce, st.st_mode);
else {
if (changed < 0) {
perror(ce->name);
continue;
}
if (silent_on_removed)
continue;
wt_mode = 0;
}
dpath->mode = wt_mode;

while (i < entries) {
struct cache_entry *nce = active_cache[i];
Expand Down Expand Up @@ -184,7 +188,9 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
* Show the diff for the 'ce' if we found the one
* from the desired stage.
*/
diff_unmerge(&revs->diffopt, ce->name, 0, null_sha1);
pair = diff_unmerge(&revs->diffopt, ce->name);
if (wt_mode)
pair->two->mode = wt_mode;
if (ce_stage(ce) != diff_unmerged_stage)
continue;
}
Expand Down Expand Up @@ -373,8 +379,9 @@ static void do_oneway_diff(struct unpack_trees_options *o,
match_missing = !revs->ignore_merges;

if (cached && idx && ce_stage(idx)) {
diff_unmerge(&revs->diffopt, idx->name, idx->ce_mode,
idx->sha1);
struct diff_filepair *pair;
pair = diff_unmerge(&revs->diffopt, idx->name);
fill_filespec(pair->one, idx->sha1, idx->ce_mode);
return;
}

Expand Down
12 changes: 6 additions & 6 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -4416,20 +4416,20 @@ void diff_change(struct diff_options *options,
DIFF_OPT_SET(options, HAS_CHANGES);
}

void diff_unmerge(struct diff_options *options,
const char *path,
unsigned mode, const unsigned char *sha1)
struct diff_filepair *diff_unmerge(struct diff_options *options, const char *path)
{
struct diff_filepair *pair;
struct diff_filespec *one, *two;

if (options->prefix &&
strncmp(path, options->prefix, options->prefix_length))
return;
return NULL;

one = alloc_filespec(path);
two = alloc_filespec(path);
fill_filespec(one, sha1, mode);
diff_queue(&diff_queued_diff, one, two)->is_unmerged = 1;
pair = diff_queue(&diff_queued_diff, one, two);
pair->is_unmerged = 1;
return pair;
}

static char *run_textconv(const char *pgm, struct diff_filespec *spec,
Expand Down
5 changes: 1 addition & 4 deletions diff.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,10 +210,7 @@ extern void diff_change(struct diff_options *,
const char *fullpath,
unsigned dirty_submodule1, unsigned dirty_submodule2);

extern void diff_unmerge(struct diff_options *,
const char *path,
unsigned mode,
const unsigned char *sha1);
extern struct diff_filepair *diff_unmerge(struct diff_options *, const char *path);

#define DIFF_SETUP_REVERSE 1
#define DIFF_SETUP_USE_CACHE 2
Expand Down
2 changes: 1 addition & 1 deletion t/t1400-update-ref.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
test_description='Test git update-ref and basic ref logging'
. ./test-lib.sh

Z=0000000000000000000000000000000000000000
Z=$_z40

test_expect_success setup '
Expand Down
7 changes: 3 additions & 4 deletions t/t1501-worktree.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ test_expect_success 'setup' '
EMPTY_TREE=$(git write-tree) &&
EMPTY_BLOB=$(git hash-object -t blob --stdin </dev/null) &&
CHANGED_BLOB=$(echo changed | git hash-object -t blob --stdin) &&
ZEROES=0000000000000000000000000000000000000000 &&
EMPTY_BLOB7=$(echo $EMPTY_BLOB | sed "s/\(.......\).*/\1/") &&
CHANGED_BLOB7=$(echo $CHANGED_BLOB | sed "s/\(.......\).*/\1/") &&
Expand Down Expand Up @@ -239,10 +238,10 @@ test_expect_success '_gently() groks relative GIT_DIR & GIT_WORK_TREE' '

test_expect_success 'diff-index respects work tree under .git dir' '
cat >diff-index-cached.expected <<-EOF &&
:000000 100644 $ZEROES $EMPTY_BLOB A sub/dir/tracked
:000000 100644 $_z40 $EMPTY_BLOB A sub/dir/tracked
EOF
cat >diff-index.expected <<-EOF &&
:000000 100644 $ZEROES $ZEROES A sub/dir/tracked
:000000 100644 $_z40 $_z40 A sub/dir/tracked
EOF
(
Expand All @@ -258,7 +257,7 @@ test_expect_success 'diff-index respects work tree under .git dir' '

test_expect_success 'diff-files respects work tree under .git dir' '
cat >diff-files.expected <<-EOF &&
:100644 100644 $EMPTY_BLOB $ZEROES M sub/dir/tracked
:100644 100644 $EMPTY_BLOB $_z40 M sub/dir/tracked
EOF
(
Expand Down
2 changes: 1 addition & 1 deletion t/t2011-checkout-invalid-head.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ test_expect_success 'checkout should not start branch from a tree' '
'

test_expect_success 'checkout master from invalid HEAD' '
echo 0000000000000000000000000000000000000000 >.git/HEAD &&
echo $_z40 >.git/HEAD &&
git checkout master --
'

Expand Down
2 changes: 0 additions & 2 deletions t/t2201-add-update-typechange.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ test_description='more git add -u'

. ./test-lib.sh

_z40=0000000000000000000000000000000000000000

test_expect_success setup '
>xyzzy &&
_empty=$(git hash-object --stdin <xyzzy) &&
Expand Down
4 changes: 2 additions & 2 deletions t/t3200-branch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ test_expect_success \
'git branch a/b/c && test -f .git/refs/heads/a/b/c'

cat >expect <<EOF
0000000000000000000000000000000000000000 $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master
$_z40 $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master
EOF
test_expect_success \
'git branch -l d/e/f should create a branch and a log' \
Expand Down Expand Up @@ -232,7 +232,7 @@ test_expect_success \

# Keep this test last, as it changes the current branch
cat >expect <<EOF
0000000000000000000000000000000000000000 $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master
$_z40 $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master
EOF
test_expect_success \
'git checkout -b g/h/i -l should create a branch and a log' \
Expand Down
3 changes: 1 addition & 2 deletions t/t3600-rm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -240,11 +240,10 @@ test_expect_success 'refresh index before checking if it is up-to-date' '

test_expect_success 'choking "git rm" should not let it die with cruft' '
git reset -q --hard &&
H=0000000000000000000000000000000000000000 &&
i=0 &&
while test $i -lt 12000
do
echo "100644 $H 0 some-file-$i"
echo "100644 $_z40 0 some-file-$i"
i=$(( $i + 1 ))
done | git update-index --index-info &&
git rm -n "some-file-*" | :;
Expand Down
5 changes: 1 addition & 4 deletions t/t4002-diff-basic.sh
Original file line number Diff line number Diff line change
Expand Up @@ -126,15 +126,12 @@ cat >.test-recursive-AB <<\EOF
:100644 100644 3fdbe17fd013303a2e981e1ca1c6cd6e72789087 7e09d6a3a14bd630913e8c75693cea32157b606d M Z/NM
EOF

x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
x40="$x40$x40$x40$x40$x40$x40$x40$x40"
z40='0000000000000000000000000000000000000000'
cmp_diff_files_output () {
# diff-files never reports additions. Also it does not fill in the
# object ID for the changed files because it wants you to look at the
# filesystem.
sed <"$2" >.test-tmp \
-e '/^:000000 /d;s/'$x40'\( [MCRNDU][0-9]*\) /'$z40'\1 /' &&
-e '/^:000000 /d;s/'$_x40'\( [MCRNDU][0-9]*\) /'$_z40'\1 /' &&
test_cmp "$1" .test-tmp
}

Expand Down
2 changes: 0 additions & 2 deletions t/t4020-diff-external.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ test_description='external diff interface test'

. ./test-lib.sh

_z40=0000000000000000000000000000000000000000

test_expect_success setup '
test_tick &&
Expand Down
1 change: 0 additions & 1 deletion t/t4027-diff-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ test_description='difference in submodules'
. ./test-lib.sh
. "$TEST_DIRECTORY"/diff-lib.sh

_z40=0000000000000000000000000000000000000000
test_expect_success setup '
test_tick &&
test_create_repo sub &&
Expand Down
87 changes: 87 additions & 0 deletions t/t4046-diff-unmerged.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/bin/sh

test_description='diff with unmerged index entries'
. ./test-lib.sh

test_expect_success setup '
for i in 0 1 2 3
do
blob=$(echo $i | git hash-object --stdin) &&
eval "blob$i=$blob" &&
eval "m$i=\"100644 \$blob$i $i\"" || break
done &&
paths= &&
for b in o x
do
for o in o x
do
for t in o x
do
path="$b$o$t" &&
case "$path" in ooo) continue ;; esac
paths="$paths$path " &&
p=" $path" &&
case "$b" in x) echo "$m1$p" ;; esac &&
case "$o" in x) echo "$m2$p" ;; esac &&
case "$t" in x) echo "$m3$p" ;; esac ||
break
done || break
done || break
done >ls-files-s.expect &&
git update-index --index-info <ls-files-s.expect &&
git ls-files -s >ls-files-s.actual &&
test_cmp ls-files-s.expect ls-files-s.actual
'

test_expect_success 'diff-files -0' '
for path in $paths
do
>"$path" &&
echo ":000000 100644 $_z40 $_z40 U $path"
done >diff-files-0.expect &&
git diff-files -0 >diff-files-0.actual &&
test_cmp diff-files-0.expect diff-files-0.actual
'

test_expect_success 'diff-files -1' '
for path in $paths
do
>"$path" &&
echo ":000000 100644 $_z40 $_z40 U $path" &&
case "$path" in
x??) echo ":100644 100644 $blob1 $_z40 M $path"
esac
done >diff-files-1.expect &&
git diff-files -1 >diff-files-1.actual &&
test_cmp diff-files-1.expect diff-files-1.actual
'

test_expect_success 'diff-files -2' '
for path in $paths
do
>"$path" &&
echo ":000000 100644 $_z40 $_z40 U $path" &&
case "$path" in
?x?) echo ":100644 100644 $blob2 $_z40 M $path"
esac
done >diff-files-2.expect &&
git diff-files -2 >diff-files-2.actual &&
test_cmp diff-files-2.expect diff-files-2.actual &&
git diff-files >diff-files-default-2.actual &&
test_cmp diff-files-2.expect diff-files-default-2.actual
'

test_expect_success 'diff-files -3' '
for path in $paths
do
>"$path" &&
echo ":000000 100644 $_z40 $_z40 U $path" &&
case "$path" in
??x) echo ":100644 100644 $blob3 $_z40 M $path"
esac
done >diff-files-3.expect &&
git diff-files -3 >diff-files-3.actual &&
test_cmp diff-files-3.expect diff-files-3.actual
'

test_done
4 changes: 2 additions & 2 deletions t/t7011-skip-worktree-reading.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ H sub/2
EOF

NULL_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
ZERO_SHA0=0000000000000000000000000000000000000000

setup_absent() {
test -f 1 && rm 1
git update-index --remove 1 &&
Expand Down Expand Up @@ -120,7 +120,7 @@ test_expect_success 'grep with skip-worktree file' '
test "$(git grep --no-ext-grep test)" = "1:test"
'

echo ":000000 100644 $ZERO_SHA0 $NULL_SHA1 A 1" > expected
echo ":000000 100644 $_z40 $NULL_SHA1 A 1" > expected
test_expect_success 'diff-index does not examine skip-worktree absent entries' '
setup_absent &&
git diff-index HEAD -- 1 > result &&
Expand Down
2 changes: 1 addition & 1 deletion t/t7012-skip-worktree-writing.sh
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ test_expect_success 'read-tree removes worktree, dirty case' '
'

NULL_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
ZERO_SHA0=0000000000000000000000000000000000000000

setup_absent() {
test -f 1 && rm 1
git update-index --remove 1 &&
Expand Down
3 changes: 3 additions & 0 deletions t/test-lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ esac
_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"

# Zero SHA-1
_z40=0000000000000000000000000000000000000000

# Each test should start with something like this, after copyright notices:
#
# test_description='Description of this test...
Expand Down

0 comments on commit 22dbeee

Please sign in to comment.