Skip to contentSkip to conversation

diff weirdness (bug?)

PATCH Dario Bertini 3 participants 5 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

git clone [email protected]:ansible/ansible.git
git revert 3616dffb68badb2b8d56

manually solve the conflict (you can look at the commit here:
https://github.com/ansible/ansible/commit/3616dffb68badb2b8d56ef34391d7aae8de79cd6
)

git diff will output:

dario@macbook ~/P/ansible (devel*+|REVERTING)> git diff

lib/ansible/constants.py +0 -0
diff --cc lib/ansible/constants.py
index c055ccf,6eac602..0000000
@@@ -84,16 -61,8 +84,12 @@@ active_user   = pwd.getpwuid(os.geteuid

# Needed so the RPM can call setup.py and have modules land in the

  # correct location. See #1277 for discussion
- if getattr(sys, "real_prefix", None):
-     # in a virtualenv
-     DIST_MODULE_PATH = os.path.join(sys.prefix, 'share/ansible/')
- else:
-     DIST_MODULE_PATH = '/usr/share/ansible/'
+ DIST_MODULE_PATH = os.path.join(sys.prefix, 'share/ansible/')

+# check all of these extensions when looking for yaml files for things
like
+# group variables
+YAML_FILENAME_EXTENSIONS = [ "", ".yml", ".yaml" ]
+

  # sections in config file
  DEFAULTS='defaults'

now, it weirdly/incorrectly says that we added the YAML-related lines

if we remove these 3 lines, we'll get this diff:

dario@macbook ~/P/ansible (devel*+|REVERTING)> git diff --patience

lib/ansible/constants.py +0 -0
diff --cc lib/ansible/constants.py
index c055ccf,6eac602..0000000
@@@ -84,16 -61,8 +84,9 @@@ active_user   = pwd.getpwuid(os.geteuid

# Needed so the RPM can call setup.py and have modules land in the

  # correct location. See #1277 for discussion
- if getattr(sys, "real_prefix", None):
-     # in a virtualenv
-     DIST_MODULE_PATH = os.path.join(sys.prefix, 'share/ansible/')
- else:
-     DIST_MODULE_PATH = '/usr/share/ansible/'
+ DIST_MODULE_PATH = os.path.join(sys.prefix, 'share/ansible/')

- # check all of these extensions when looking for yaml files for things like
- # group variables
- YAML_FILENAME_EXTENSIONS = [ "", ".yml", ".yaml" ]
+

  # sections in config file
  DEFAULTS='defaults'

even more weirdly, it'll say that we deleted the yaml-related lines

if we also remove one of the extra blank lines next to the yaml lines we get an empty diff:

dario@macbook ~/P/ansible (devel*+|REVERTING)> git diff

lib/ansible/constants.py +0 -0
diff --cc lib/ansible/constants.py
index c055ccf,6eac602..0000000

running git add . and then checking with git diff --cached will show that everything is normal

the output is the same also with
git diff --minimal
or
git diff --patience

Signature · 4 lines
xmpp: [email protected]
bitmessage: BM-2cTYXfGiSTsnx3righ6aHcJSWe4MV17jDP
gpg fingerprint: 3F8D53518012716C4EEF7DF67B498306B3BF75A0 (used just
for signing commits)
#1 lore raw
Quoted 30 lines · Dario Bertini

git clone [email protected]:ansible/ansible.git
git revert 3616dffb68badb2b8d56

manually solve the conflict (you can look at the commit here:
https://github.com/ansible/ansible/commit/3616dffb68badb2b8d56ef34391d7aae8de79cd6
)

git diff will output:

dario@macbook ~/P/ansible (devel*+|REVERTING)> git diff

lib/ansible/constants.py +1 -5
diff --cc lib/ansible/constants.py
index c055ccf,6eac602..0000000
@@@ -84,16 -61,8 +84,12 @@@ active_user   = pwd.getpwuid(os.geteuid
 
  # Needed so the RPM can call setup.py and have modules land in the
  # correct location. See #1277 for discussion
- if getattr(sys, "real_prefix", None):
-     # in a virtualenv
-     DIST_MODULE_PATH = os.path.join(sys.prefix, 'share/ansible/')
- else:
-     DIST_MODULE_PATH = '/usr/share/ansible/'
+ DIST_MODULE_PATH = os.path.join(sys.prefix, 'share/ansible/')
 
 +# check all of these extensions when looking for yaml files for things

like
+# group variables +YAML_FILENAME_EXTENSIONS = [ "", ".yml", ".yaml" ] +

Quoted 6 lines
  # sections in config file
  DEFAULTS='defaults'

now, it weirdly/incorrectly says that we added the YAML-related lines

This is a combined diff, and yaml-related lines are added relative to your _other_ branch you are merging (notice these + are indented by one place). Relative to what you had at the tip of your branch before you started this operation that ended up conflicted, the half-merged result removes if/else that sets DIST_MODULE_PATH and replaces it with a single line (their +/- are on the first column, signifying that these are differences relative to the first parent, i.e. your state before you started the operation).

Quoted 1 line

if we remove these 3 lines, we'll get this diff:

With that understanding, I think the output after removing these three lines is perfectlyh understandable and correct. You are looking at the three lines that used to exist in the version you started from, that were missing from the other side. If you remoe them, it will show as removal from _your_ version (notice these - that shows what _you_ did manually are on the first column, saying that that is relative to _your_ version).

#2 lore raw
Quoted 11 lines · Junio C Hamano

This is a combined diff, and yaml-related lines are added relative to your _other_ branch you are merging (notice these + are indented by one place). Relative to what you had at the tip of your branch before you started this operation that ended up conflicted, the half-merged result removes if/else that sets DIST_MODULE_PATH and replaces it with a single line (their +/- are on the first column, signifying that these are differences relative to the first parent, i.e. your state before you started the operation).

Quoted 1 line

if we remove these 3 lines, we'll get this diff:

Quoted 8 lines

With that understanding, I think the output after removing these three lines is perfectlyh understandable and correct. You are looking at the three lines that used to exist in the version you started from, that were missing from the other side. If you remoe them, it will show as removal from _your_ version (notice these - that shows what _you_ did manually are on the first column, saying that that is relative to _your_ version).

Thank you, I was completely unaware of combined diffs. Still: I can't see how this would explain the empty diff when deleting 4 lines instead of 3.

Also: in the diff output I get 2 hashes, but these are not the hashes of the commits, but the contents of the files apparently. One should be HEAD (but if I run sha1sum over the file the hash doesn't match), but the other can't be the commit which I reverted: the diff is too small... or at least this is what I understand

By the way, in the man of git diff there's the briefly mentioned '-m' flag. If anyone else reading this mail in the archives is confused by the combined diff output, just use "git diff -m HEAD"... I'll probably add this in my git aliases

Signature · 4 lines
xmpp: [email protected]
bitmessage: BM-2cTYXfGiSTsnx3righ6aHcJSWe4MV17jDP
gpg fingerprint: 3F8D53518012716C4EEF7DF67B498306B3BF75A0 (used just
for signing commits)
#3 lore raw
Quoted 21 lines · Dario Bertini
Quoted 11 lines · Junio C Hamano

This is a combined diff, and yaml-related lines are added relative to your _other_ branch you are merging (notice these + are indented by one place). Relative to what you had at the tip of your branch before you started this operation that ended up conflicted, the half-merged result removes if/else that sets DIST_MODULE_PATH and replaces it with a single line (their +/- are on the first column, signifying that these are differences relative to the first parent, i.e. your state before you started the operation).

Quoted 1 line

if we remove these 3 lines, we'll get this diff:

Quoted 8 lines

With that understanding, I think the output after removing these three lines is perfectlyh understandable and correct. You are looking at the three lines that used to exist in the version you started from, that were missing from the other side. If you remoe them, it will show as removal from _your_ version (notice these - that shows what _you_ did manually are on the first column, saying that that is relative to _your_ version).

Quoted 3 lines

Thank you, I was completely unaware of combined diffs. Still: I can't see how this would explain the empty diff when deleting 4 lines instead of 3.

With a --cc diff (which it is: it says 'diff --cc' in the file headers) git doesn't show the combined diff for hunks that fully agree with one side.

So if you (even manually) resolve the merge so that it fully matches one side, that will not show up in a --cc diff.

Signature · 2 lines
Thomas Rast
[email protected]
#4 lore raw
In reply to Dario Bertini
Quoted 21 lines · Dario Bertini
Quoted 11 lines · Junio C Hamano

This is a combined diff, and yaml-related lines are added relative to your _other_ branch you are merging (notice these + are indented by one place). Relative to what you had at the tip of your branch before you started this operation that ended up conflicted, the half-merged result removes if/else that sets DIST_MODULE_PATH and replaces it with a single line (their +/- are on the first column, signifying that these are differences relative to the first parent, i.e. your state before you started the operation).

Quoted 1 line

if we remove these 3 lines, we'll get this diff:

Quoted 8 lines

With that understanding, I think the output after removing these three lines is perfectlyh understandable and correct. You are looking at the three lines that used to exist in the version you started from, that were missing from the other side. If you remoe them, it will show as removal from _your_ version (notice these - that shows what _you_ did manually are on the first column, saying that that is relative to _your_ version).

Quoted 7 lines

Thank you, I was completely unaware of combined diffs. Still: I can't see how this would explain the empty diff when deleting 4 lines instead of 3.

Also: in the diff output I get 2 hashes, but these are not the hashes of the commits, but the contents of the files apparently. One should be HEAD (but if I run sha1sum over the file the hash doesn't match), but

A blob object name (or for that matter, names of any type of object) is not the same as the hash over its contents alone.

See "combined diff format" section of "git diff --help" if you are interested in reading what the output format is telling you.

Quoted 7 lines

the other can't be the commit which I reverted: the diff is too small... or at least this is what I understand

By the way, in the man of git diff there's the briefly mentioned '-m' flag. If anyone else reading this mail in the archives is confused by the combined diff output, just use "git diff -m HEAD"... I'll probably add this in my git aliases

If you are primarily interested in what a merge (or other mergy-operation like revert) did to your working tree state, relative to the state it operated on, "git diff HEAD" is most likely what you want.