Date post: | 24-May-2015 |
Category: |
Technology |
Upload: | psluaces |
View: | 506 times |
Download: | 0 times |
No fear refactoring in the DVCS age
Enter SemanticMerge
pablo santos @psluaces@semanticmerge
meet us at booth #14
Agenda
• How to diff and merge refactored code with SemanticMerge• Under the hood: the inner workings of the tool• Next step: multi-file SemanticMerge• Towards Semantic version control
Tech from the 80’s
• Git and the DVCS pack came in 2005• They went mainstream (GitHub)• They all can do awesome merges• But they rely on old-fashioned diff and merge tools
You can do amazing things with DVCS
You can do amazing things with DVCS• It has greatly improved merge tracking• It does a great job finding the contributors for the
3-way merge
• But at the end of the day… it invokes an external 3-way merge tool to solve the merge
Simple example
Simple example
Simple example
What will a conventional 3-way merge tool do?• No conflict!• And two methods!!
What will a conventional 3-way merge tool do?• No conflict!• And two methods!!
• It simply finds two blocks of text being added and the original block being deleted… Doesn’t care about the code structure
What SemanticMerge does• It *knows* about the methods so…
What is semanticmerge?
• It is a 3-way merge tool (handles src, dst and base).
• It is refactor-aware and programming language-aware.
• Handles merging at the structure level and not textblock level.
• It means: • It first parses the code – creates intermediate
trees.• Then calculates diff pairs: base-src, base-dst.• Then looks for conflicts between pairs.
• Enabling eXtreme Refactoring was always the goal :-)
I guess you all know by now ;-)
How can semanticmerge affect development?We were always motivated by “the cost of change” and how refactoring can greatly help keeping code quality high and reducing maintenance costs.
SemanticMerge is all about helping teams to clean up the code, keep it readable and simple, without restrictions: do it in parallel, fine!
How can semanticmerge affect development?
1) It helps simplifying the merges TODAY already.
2) But more importantly it enables new scenarios that you’re not doing today: clean up the code, move methods, split classes… and just be able to merge it back.
A SemanticMerge scenario
A divergent move case
Detect conflicts that regular tools can’t• What if the same method is modified concurrently
at different lines?• Semantic detects the case and can force the
conflict resolution to be manual – a regular text based merge tool can’t do that because it doesn’t have the context
Under the hood
Creating a tree-like view of the code
namespace Sample [4-26]
int Add(int a, int b) [8-12]
int Mul(int a, int b) [14-18]
int Subst(int a, int b) [20-24]
using System [1]
using System.Text [2]
class Math [6-25]
Processbase
base tree
source destination
Parser
source tree destination tree
Diff er Diff er
Merger
src-base diff s dst-base diff s
result
automatic confl icts
manual confl icts
source ops to apply
Some complex cases – cyclic move
namespace Testnamespace Test
namespace Test
class Socket
class Socket
class DNS
class DNS
class Socket
base
source destination
class Utils
class Utils
class DNSclass Utils
Evil twinnamespace Test
class Socket
base
source
method Connect
namespace Test
class Socket
method Connect
namespace Test
class Socket
method Connect
destination
method Send method Send
Two methods with exactly the same signature can’t be added on the same
location -> conflict
Integrations
• IntelliJ (and Android Studio)• Git, Mercurial, TFS, Plastic SCM, Perforce, SVN…
everything!
Next steps
• JavaScript is the top request• C/C++ - Objective-C• XML• Ruby, Scala…•Mac OS X support• External Parsers (Delphi
already there)
Check UserVoice - http://plasticscm.uservoice.com
Next steps
• Semantic code review – each time you review code you would like to go straight to the point…
• Semantic blame/annotate – calculate the blame considering methods
• Semantic Method History• Semantic repository stats
Multi-file SemanticMerge