Merge lp:~mwhudson/merge-o-matic/exec-bits into lp:merge-o-matic

Proposed by Michael Hudson-Doyle
Status: Merged
Approved by: Steve Langasek
Approved revision: 318
Merged at revision: 317
Proposed branch: lp:~mwhudson/merge-o-matic/exec-bits
Merge into: lp:merge-o-matic
Diff against target: 73 lines (+33/-19)
1 file modified
produce-merges.py (+33/-19)
To merge this branch: bzr merge lp:~mwhudson/merge-o-matic/exec-bits
Reviewer Review Type Date Requested Status
Steve Langasek Approve
Review via email: mp+355396@code.launchpad.net

Commit message

Fix the thing where merged files lose their exec bit.

To post a comment you must log in.
Revision history for this message
Steve Langasek (vorlon) :
review: Needs Fixing
lp:~mwhudson/merge-o-matic/exec-bits updated
318. By Michael Hudson-Doyle

review feedback

Revision history for this message
Steve Langasek (vorlon) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'produce-merges.py'
--- produce-merges.py 2016-11-18 21:42:52 +0000
+++ produce-merges.py 2018-09-20 08:52:05 +0000
@@ -588,36 +588,50 @@
588 dest = "%s/%s" % (merged_dir, filename)588 dest = "%s/%s" % (merged_dir, filename)
589 ensure(dest)589 ensure(dest)
590590
591 with open(dest, "w") as output:591 left = "%s/%s" % (left_dir, filename)
592 right = "%s/%s" % (right_dir, filename)
593 base = "%s/%s" % (base_dir, filename)
594
595 left_stat = os.stat(left)
596 right_stat = os.stat(right)
597 base_stat = os.stat(base)
598
599 # Preserve execute bit on merged file. This all ignores the distinction
600 # between the ugo exec bits because it's hard to think of a reason we
601 # should.
602 mode = 0o644
603 if stat.S_IMODE(base_stat) & 0o111:
604 # If base was executable and both left and right are, make output
605 # executable.
606 if stat.S_IMODE(right_stat) & stat.S_IMODE(left_stat) & 0o111:
607 mode |= 0o111
608 else:
609 # Alternatively, if base was not executable and either of left and right
610 # are, make output executable.
611 if (stat.S_IMODE(right_stat) | stat.S_IMODE(left_stat)) & 0o111:
612 mode |= 0o111
613
614 with open(dest, "w", mode) as output:
592 status = shell.run(("diff3", "-E", "-m",615 status = shell.run(("diff3", "-E", "-m",
593 "-L", left_name, "%s/%s" % (left_dir, filename),616 "-L", left_name, left,
594 "-L", "BASE", "%s/%s" % (base_dir, filename),617 "-L", "BASE", base,
595 "-L", right_name, "%s/%s" % (right_dir, filename)),618 "-L", right_name, right),
596 stdout=output, okstatus=(0,1,2))619 stdout=output, okstatus=(0,1,2))
597620
598 if status != 0:621 if status != 0:
599 if not tree.exists(dest) or os.stat(dest).st_size == 0:622 if not tree.exists(dest) or os.stat(dest).st_size == 0:
600 # Probably binary623 # Probably binary
601 if same_file(os.stat("%s/%s" % (left_dir, filename)), left_dir,624 if same_file(left_stat, left_dir, right_stat, right_dir, filename):
602 os.stat("%s/%s" % (right_dir, filename)), right_dir,
603 filename):
604 logging.debug("binary files are the same: %s", filename)625 logging.debug("binary files are the same: %s", filename)
605 tree.copyfile("%s/%s" % (left_dir, filename),626 tree.copyfile(left, dest)
606 "%s/%s" % (merged_dir, filename))627 elif same_file(base_stat, base_dir, left_stat, left_dir, filename):
607 elif same_file(os.stat("%s/%s" % (base_dir, filename)), base_dir,
608 os.stat("%s/%s" % (left_dir, filename)), left_dir,
609 filename):
610 logging.debug("preserving binary change in %s: %s",628 logging.debug("preserving binary change in %s: %s",
611 right_distro, filename)629 right_distro, filename)
612 tree.copyfile("%s/%s" % (right_dir, filename),630 tree.copyfile(right, dest)
613 "%s/%s" % (merged_dir, filename))631 elif same_file(base_stat, base_dir, right_stat, right_dir, filename):
614 elif same_file(os.stat("%s/%s" % (base_dir, filename)), base_dir,
615 os.stat("%s/%s" % (right_dir, filename)), right_dir,
616 filename):
617 logging.debug("preserving binary change in %s: %s",632 logging.debug("preserving binary change in %s: %s",
618 left_distro, filename)633 left_distro, filename)
619 tree.copyfile("%s/%s" % (left_dir, filename),634 tree.copyfile(left, dest)
620 "%s/%s" % (merged_dir, filename))
621 else:635 else:
622 logging.debug("binary file conflict: %s", filename)636 logging.debug("binary file conflict: %s", filename)
623 conflict_file(left_dir, left_distro, right_dir, right_distro,637 conflict_file(left_dir, left_distro, right_dir, right_distro,

Subscribers

People subscribed via source and target branches

to status/vote changes: