Thread (6 messages) 6 messages, 4 authors, 2016-06-15

Re: Fwd: Git Directory Diff for submodule

From: David Aguilar <hidden>
Date: 2016-06-15 22:59:58

On Thu, Feb 20, 2014 at 1:03 PM, Jens Lehmann [off-list ref] wrote:
Sorry for the late reply, but here we go ...

Am 10.02.2014 07:33, schrieb Gábor Lipták:
quoted
Hi Jens,

So "git status" says:

liptak@liptak-kubuntu:~/Projects/MAIN_MODULE/platform/SUBMODULE
[master]$ git status
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working
directory)
#
#       modified:   xxxxxx.java
#       modified:   xxxxxxx.java
# ...
# ...
# ...
# ...
# ...
#
no changes added to commit (use "git add" and/or "git commit -a")

git config core.worktree gives back: "../../../../platform/SUBMODULE"
Which looks a bit strange but is perfectly ok for a repository
that uses a gitfile, as the core.worktree setting is relative
to the git directory the gitfile references and not the directory
the gitfile lives in. A quick glance at the find_worktree
subroutine in git-difftool.perl makes me think that difftool is
not aware of that fact. David, does that make sense?
That does make sense. It sounds like that may need to be adjusted.

What does `git rev-parse --show-toplevel` print? It seems like the
find_worktree() logic needs to be extended to handle .git files.
quoted
The submodule was inited simply with "git submodule init" +
"git.submodule update"
Or possibly, as you mention below, it could be that "git submodule
init" ended up writing the wrong core.worktree value. I'm not very
familiar with how they are initialized, but the paths do seem sane, so
I doesn't seem like that's the issue.

If it's a problem in difftool we can probably find a way to do the
right thing. It looks like the core.worktree is relative to the
.git/modules/XXX directory rather than the submodule (and
super-project)'s worktree.

Here's our current logic:

sub find_worktree
{
    my ($repo) = @_;

    # Git->repository->wc_path() does not honor changes to the working
    # tree location made by $ENV{GIT_WORK_TREE} or the 'core.worktree'
    # config variable.
    my $worktree;
    my $env_worktree = $ENV{GIT_WORK_TREE};
    my $core_worktree = Git::config('core.worktree');

    if (defined($env_worktree) and (length($env_worktree) > 0)) {
        $worktree = $env_worktree;
    } elsif (defined($core_worktree) and (length($core_worktree) > 0)) {
        $worktree = $core_worktree;
    } else {
        $worktree = $repo->wc_path();
    }
    return $worktree;
}

John, any thoughts?
quoted
MAINMODULE/.gitsubmodules file contains similar entry:
[submodule "platform/SUBMODULE"]
path = platform/SUBMODULE
url = ssh://git@somehost/foo/bar.git

MAINMODULE/.git/config:
[submodule "platform/SUBMODULE"]
url = ssh://git@somehost/foo/bar.git

MAINMODULE/platform/SUBMODULE/.git:
gitdir: ../../.git/modules/platform/SUBMODULE

MAINMODULE/.git/modules/platform/SUBMODULE/config:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
worktree = ../../../../platform/SUBMODULE
[remote "origin"]
url = ssh://git@somehost/foo/bar.git
fetch = +refs/heads/*:refs/remotes/origin/*

So for me it seems that somehow the relative path inside
MAINMODULE/.git/modules/platform/SUBMODULE/config gets configuread
wrong during submodule init+update.

I tried to update the
MAINMODULE/.git/modules/platform/SUBMODULE/config to contain
../../platform/SUBMODULE as worktree path, then meld was correctly
started, but the compare tree was not usable. For file changes it
displayed always: XXXXX.java: Dangling symlink. So this is still not a
complete solution somehow.

Regards,

Gábor Lipták

2014-02-07 Jens Lehmann [off-list ref]:
quoted
Am 07.02.2014 10:15, schrieb Gábor Lipták:
quoted
I think I have found a bug related to submodules and directory diff.
See the details at hXXp://stackoverflow.com/q/21623155/337621.
Let's inline the recipe one finds after decrypting this link:

~/Projects/MAINMODULE/platform/SUBMODULE [master]$ git difftool -tool=meld --dir-diff --cached
  fatal: Could not switch to '../../../../platform/': No such file or directory
  diff --raw --no-abbrev -z --cached: command returned error: 128
~/Projects/MAINMODULE/platform/SUBMODULE [master]$ cd ..
~/Projects/MAINMODULE/platform [master]$ cd ..
~/Projects/MAINMODULE [master]$ git difftool -tool=meld --dir-diff --cached
  // NO PROBLEM, works.
~/Projects/MAINMODULE [master]$ git version
  git version 1.8.4

quoted
If you need any further details, just ask.
- Does this only happen when you use difftool? E.g. what does
  "git status" inside the submodule say?

- What does "git config core.worktree" print when run in the
  submodule?
-- 
David
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help