From: Johannes Sixt <hidden> Date: 2016-06-15 22:42:58
If the file system does not support symbolic links (core.symlinks=false),
merge-recursive must write the merged symbolic link text into a regular
file.
While we are here, fix a tiny memory leak in the if-branch that writes
real symbolic links.
Signed-off-by: Johannes Sixt <redacted>
---
merge-recursive.c | 3 +-
t/t6025-merge-symlinks.sh | 62 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 1 deletions(-)
create mode 100644 t/t6025-merge-symlinks.sh
@@ -570,7 +570,7 @@ static void update_file_flags(const unsigned char *sha,if(strcmp(type,blob_type)!=0)die("blob expected for %s '%s'",sha1_to_hex(sha),path);-if(S_ISREG(mode)){+if(S_ISREG(mode)||(!has_symlinks&&S_ISLNK(mode))){intfd;if(mkdir_p(path,0777))die("failed to create path %s: %s",path,strerror(errno));
@@ -591,6 +591,7 @@ static void update_file_flags(const unsigned char *sha,mkdir_p(path,0777);unlink(path);symlink(lnk,path);+free(lnk);}elsedie("do not know what to do with %06o %s '%s'",mode,sha1_to_hex(sha),path);
@@ -0,0 +1,62 @@+#!/bin/sh+#+# Copyright (c) 2007 Johannes Sixt+#++test_description='mergingsymlinksonfilesystemw/osymlinksupport.++Thisteststhatgit-merge-recursivewritesmergeresultsasplainfiles+ifcore.symlinksisfalse.'++../test-lib.sh++test_expect_success\+'setup''+git-configcore.symlinksfalse&&+>file&&+git-addfile&&+git-commit-minitial&&+git-branchb-symlink&&+git-branchb-file&&+l=$(echo-nfile|git-hash-object-tblob-w--stdin)&&+echo"120000 $l symlink"|git-update-index--index-info&&+git-commit-mmaster&&+git-checkoutb-symlink&&+l=$(echo-nfile-different|git-hash-object-tblob-w--stdin)&&+echo"120000 $l symlink"|git-update-index--index-info&&+git-commit-mb-symlink&&+git-checkoutb-file&&+echoplain-file>symlink&&+git-addsymlink&&+git-commit-mb-file'++test_expect_failure\+'merge master into b-symlink, which has a different symbolic link''+!git-checkoutb-symlink||+git-mergemaster'++test_expect_success\+'the merge result must be a file''+test-fsymlink'++test_expect_failure\+'merge master into b-file, which has a file instead of a symbolic link''+!(git-reset--hard&&+git-checkoutb-file)||+git-mergemaster'++test_expect_success\+'the merge result must be a file''+test-fsymlink'++test_expect_failure\+'merge b-file, which has a file instead of a symbolic link, into master''+!(git-reset--hard&&+git-checkoutmaster)||+git-mergeb-file'++test_expect_success\+'the merge result must be a file''+test-fsymlink'++test_done
From: Johannes Sixt <hidden> Date: 2016-06-15 22:42:58
When core.symlinks is false, and a merge of symbolic links had conflicts,
the merge result is left as a file in the working directory. A decision
must be made whether the file is treated as a regular file or as a
symbolic link. This patch treats the file as a symbolic link only if
all merge parents were also symbolic links.
Signed-off-by: Johannes Sixt <redacted>
---
I'm not quite sure whether this patch is worth it. The only thing it seems
to do is to avoid the mode change line (this is after a merge where 'symlink'
had a conflict):
without the patch:
$ git diff
diff --cc symlink
index 1a010b1,30d67d4..0000000
mode 120000,120000..100644
--- a/symlink
+++ b/symlink
with the patch:
$ git diff
diff --cc symlink
index 1a010b1,30d67d4..0000000
--- a/symlink
+++ b/symlink
combine-diff.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
@@ -699,8 +699,18 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,!fstat(fd,&st)){size_tlen=st.st_size;size_tsz=0;+intis_file,i;elem->mode=canon_mode(st.st_mode);+/* if symlinks don't work, assume symlink if all parents+*aresymlinks+*/+is_file=has_symlinks;+for(i=0;!is_file&&i<num_parent;i++)+is_file=!S_ISLNK(elem->parent[i].mode);+if(!is_file)+elem->mode=canon_mode(S_IFLNK);+result_size=len;result=xmalloc(len+1);while(sz<len){
From: Johannes Schindelin <hidden> Date: 2016-06-15 22:42:58
Hi,
On Sat, 3 Mar 2007, Johannes Sixt wrote:
If the file system does not support symbolic links
(core.symlinks=false), merge-recursive must write the merged symbolic
link text into a regular file.
I think regardless of the value of core.symlinks, merging symbolic links
does not make sense at all.
I'd suggest having two versions of the symlöink/file, <name>Ã~ours and
<name>~theirs instead.
Ciao,
Dscho
From: Johannes Sixt <hidden> Date: 2016-06-15 22:42:58
On Saturday 03 March 2007 20:32, Johannes Sixt wrote:
If the file system does not support symbolic links (core.symlinks=false),
merge-recursive must write the merged symbolic link text into a regular
file.
But how to resolve such a conflict if core.symlinks=false?
It turns out that git-add cannot honor the symlink property recorded in the
index because read_cache.c:add_file_to_index() will find only entries at
stage 0, but the conflicting entries are at stages 2 and 3. Can there be
something done about that?
-- Hannes
From: Johannes Sixt <hidden> Date: 2016-06-15 22:42:58
On Saturday 03 March 2007 21:11, Johannes Schindelin wrote:
I think regardless of the value of core.symlinks, merging symbolic links
does not make sense at all.
No doubt about that. Currently, the version of the "current" branch remains in
the working tree. My patch does not change this behavior at all, it just does
not call symlink(2), but allocates a regular file.
-- Hannes
From: Johannes Schindelin <hidden> Date: 2016-06-15 22:42:58
Hi,
On Sat, 3 Mar 2007, Johannes Sixt wrote:
On Saturday 03 March 2007 21:11, Johannes Schindelin wrote:
quoted
I think regardless of the value of core.symlinks, merging symbolic
links does not make sense at all.
No doubt about that. Currently, the version of the "current" branch
remains in the working tree. My patch does not change this behavior at
all, it just does not call symlink(2), but allocates a regular file.
Oh, I misunderstood! All is well, then. (I had the impression you put
conflict markers into the file.)
Ciao,
Dscho