[PATCH 2 of 3 relative-diff] commands.diff: add support for diffs relative to a subdirectory

Siddharth Agarwal sid0 at fb.com
Mon Mar 23 19:36:35 CDT 2015


# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1426632390 25200
#      Tue Mar 17 15:46:30 2015 -0700
# Node ID 5176824fc54fd930f8032a15792b3b68d5dd8d1f
# Parent  f236bca9db2623e0a9a978639e51017d4b98e4a2
commands.diff: add support for diffs relative to a subdirectory

Previous patches added all the backend support for this. This exposes this
option in the UI.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -148,6 +148,7 @@
     ('U', 'unified', '',
      _('number of lines of context to show'), _('NUM')),
     ('', 'stat', None, _('output diffstat-style summary of changes')),
+    ('', 'relative', '', _('produce diffs relative to subdirectory'), _('DIR')),
 ]
 
 mergetoolopts = [
@@ -3169,7 +3170,8 @@
     diffopts = patch.diffallopts(ui, opts)
     m = scmutil.match(repo[node2], pats, opts)
     cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
-                           listsubrepos=opts.get('subrepos'))
+                           listsubrepos=opts.get('subrepos'),
+                           relative=opts.get('relative'))
 
 @command('^export',
     [('o', 'output', '',
diff --git a/tests/test-completion.t b/tests/test-completion.t
--- a/tests/test-completion.t
+++ b/tests/test-completion.t
@@ -203,7 +203,7 @@
   annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, ignore-all-space, ignore-space-change, ignore-blank-lines, include, exclude, template
   clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure
   commit: addremove, close-branch, amend, secret, edit, interactive, include, exclude, message, logfile, date, user, subrepos
-  diff: rev, change, text, git, nodates, noprefix, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos
+  diff: rev, change, text, git, nodates, noprefix, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, relative, include, exclude, subrepos
   export: output, switch-parent, rev, text, git, nodates
   forget: include, exclude
   init: ssh, remotecmd, insecure
diff --git a/tests/test-diff-subdir.t b/tests/test-diff-subdir.t
--- a/tests/test-diff-subdir.t
+++ b/tests/test-diff-subdir.t
@@ -44,4 +44,24 @@
   @@ -0,0 +1,1 @@
   +2
 
+relative to beta
+
   $ cd ..
+  $ hg diff --nodates --relative beta
+  diff -r 7d5ef1aea329 two
+  --- a/two
+  +++ b/two
+  @@ -0,0 +1,1 @@
+  +2
+
+inside beta
+
+  $ cd beta
+  $ hg diff --nodates --relative .
+  diff -r 7d5ef1aea329 two
+  --- a/two
+  +++ b/two
+  @@ -0,0 +1,1 @@
+  +2
+
+  $ cd ..
diff --git a/tests/test-diffstat.t b/tests/test-diffstat.t
--- a/tests/test-diffstat.t
+++ b/tests/test-diffstat.t
@@ -69,4 +69,39 @@
    file with spaces |  Bin 
    1 files changed, 0 insertions(+), 0 deletions(-)
 
+diffstat within directories:
+
+  $ hg rm -f 'file with spaces'
+
+  $ mkdir dir1 dir2
+  $ echo new1 > dir1/new
+  $ echo new2 > dir2/new
+  $ hg add dir1/new dir2/new
+  $ hg diff --stat
+   dir1/new |  1 +
+   dir2/new |  1 +
+   2 files changed, 2 insertions(+), 0 deletions(-)
+
+  $ hg diff --stat --relative dir1
+   new |  1 +
+   1 files changed, 1 insertions(+), 0 deletions(-)
+
+  $ hg diff --stat --relative dir1 dir2
+  warning: dir2 not inside relative root dir1
+
+  $ hg diff --stat --relative dir1 -I dir1/old
+
+  $ cd dir1
+  $ hg diff --stat .
+   dir1/new |  1 +
+   1 files changed, 1 insertions(+), 0 deletions(-)
+  $ hg diff --stat --relative .
+   new |  1 +
+   1 files changed, 1 insertions(+), 0 deletions(-)
+
+  $ hg diff --stat --relative ../dir1 ../dir2
+  warning: ../dir2 not inside relative root .
+
+  $ hg diff --stat --relative . -I old
+
   $ cd ..
diff --git a/tests/test-git-export.t b/tests/test-git-export.t
--- a/tests/test-git-export.t
+++ b/tests/test-git-export.t
@@ -5,46 +5,279 @@
 
 New file:
 
-  $ echo new > new
+  $ mkdir dir1
+  $ echo new > dir1/new
   $ hg ci -Amnew
-  adding new
+  adding dir1/new
   $ hg diff --git -r 0
-  diff --git a/new b/new
+  diff --git a/dir1/new b/dir1/new
   new file mode 100644
   --- /dev/null
-  +++ b/new
+  +++ b/dir1/new
   @@ -0,0 +1,1 @@
   +new
 
 Copy:
 
-  $ hg cp new copy
+  $ mkdir dir2
+  $ hg cp dir1/new dir1/copy
+  $ echo copy1 >> dir1/copy
+  $ hg cp dir1/new dir2/copy
+  $ echo copy2 >> dir2/copy
   $ hg ci -mcopy
   $ hg diff --git -r 1:tip
+  diff --git a/dir1/new b/dir1/copy
+  copy from dir1/new
+  copy to dir1/copy
+  --- a/dir1/new
+  +++ b/dir1/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy1
+  diff --git a/dir1/new b/dir2/copy
+  copy from dir1/new
+  copy to dir2/copy
+  --- a/dir1/new
+  +++ b/dir2/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy2
+
+Cross and same-directory copies with a relative root:
+
+  $ hg diff --git --relative .. -r 1:tip
+  abort: .. not under root '$TESTTMP'
+  [255]
+  $ hg diff --git --relative doesnotexist -r 1:tip
+  $ hg diff --git --relative . -r 1:tip
+  diff --git a/dir1/new b/dir1/copy
+  copy from dir1/new
+  copy to dir1/copy
+  --- a/dir1/new
+  +++ b/dir1/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy1
+  diff --git a/dir1/new b/dir2/copy
+  copy from dir1/new
+  copy to dir2/copy
+  --- a/dir1/new
+  +++ b/dir2/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy2
+  $ hg diff --git --relative dir1 -r 1:tip
   diff --git a/new b/copy
   copy from new
   copy to copy
+  --- a/new
+  +++ b/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy1
+
+  $ hg diff --git --relative dir2/ -r 1:tip
+  diff --git a/copy b/copy
+  new file mode 100644
+  --- /dev/null
+  +++ b/copy
+  @@ -0,0 +1,2 @@
+  +new
+  +copy2
+
+  $ hg diff --git --relative dir1 -r 1:tip -I '**/copy'
+  diff --git a/new b/copy
+  copy from new
+  copy to copy
+  --- a/new
+  +++ b/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy1
+
+  $ hg diff --git --relative dir1 -r 1:tip dir2
+  warning: dir2 not inside relative root dir1
+
+  $ hg diff --git --relative dir1 -r 1:tip 'dir2/{copy}'
+  warning: dir2/{copy} not inside relative root dir1
+
+  $ cd dir1
+  $ hg diff --git --relative .. -r 1:tip
+  diff --git a/dir1/new b/dir1/copy
+  copy from dir1/new
+  copy to dir1/copy
+  --- a/dir1/new
+  +++ b/dir1/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy1
+  diff --git a/dir1/new b/dir2/copy
+  copy from dir1/new
+  copy to dir2/copy
+  --- a/dir1/new
+  +++ b/dir2/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy2
+
+  $ hg diff --git --relative ../.. -r 1:tip
+  abort: ../.. not under root '$TESTTMP'
+  [255]
+  $ hg diff --git --relative ../doesnotexist -r 1:tip
+  $ hg diff --git --relative .. -r 1:tip
+  diff --git a/dir1/new b/dir1/copy
+  copy from dir1/new
+  copy to dir1/copy
+  --- a/dir1/new
+  +++ b/dir1/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy1
+  diff --git a/dir1/new b/dir2/copy
+  copy from dir1/new
+  copy to dir2/copy
+  --- a/dir1/new
+  +++ b/dir2/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy2
+
+  $ hg diff --git --relative . -r 1:tip
+  diff --git a/new b/copy
+  copy from new
+  copy to copy
+  --- a/new
+  +++ b/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy1
+  $ hg diff --git --relative . -r 1:tip copy
+  diff --git a/new b/copy
+  copy from new
+  copy to copy
+  --- a/new
+  +++ b/copy
+  @@ -1,1 +1,2 @@
+   new
+  +copy1
+  $ hg diff --git --relative . -r 1:tip ../dir2
+  warning: ../dir2 not inside relative root .
+  $ hg diff --git --relative . -r 1:tip '../dir2/*'
+  warning: ../dir2/* not inside relative root .
+  $ cd ..
 
 Rename:
 
-  $ hg mv copy rename
+  $ hg mv dir1/copy dir1/rename1
+  $ echo rename1 >> dir1/rename1
+  $ hg mv dir2/copy dir1/rename2
+  $ echo rename2 >> dir1/rename2
   $ hg ci -mrename
   $ hg diff --git -r 2:tip
-  diff --git a/copy b/rename
+  diff --git a/dir1/copy b/dir1/rename1
+  rename from dir1/copy
+  rename to dir1/rename1
+  --- a/dir1/copy
+  +++ b/dir1/rename1
+  @@ -1,2 +1,3 @@
+   new
+   copy1
+  +rename1
+  diff --git a/dir2/copy b/dir1/rename2
+  rename from dir2/copy
+  rename to dir1/rename2
+  --- a/dir2/copy
+  +++ b/dir1/rename2
+  @@ -1,2 +1,3 @@
+   new
+   copy2
+  +rename2
+
+Cross and same-directory renames with a relative root:
+
+  $ hg diff --relative dir1 --git -r 2:tip
+  diff --git a/copy b/rename1
   rename from copy
-  rename to rename
+  rename to rename1
+  --- a/copy
+  +++ b/rename1
+  @@ -1,2 +1,3 @@
+   new
+   copy1
+  +rename1
+  diff --git a/rename2 b/rename2
+  new file mode 100644
+  --- /dev/null
+  +++ b/rename2
+  @@ -0,0 +1,3 @@
+  +new
+  +copy2
+  +rename2
+
+  $ hg diff --relative dir2 --git -r 2:tip
+  diff --git a/copy b/copy
+  deleted file mode 100644
+  --- a/copy
+  +++ /dev/null
+  @@ -1,2 +0,0 @@
+  -new
+  -copy2
+
+  $ hg diff --relative dir1 --git -r 2:tip -I '**/copy'
+  diff --git a/copy b/copy
+  deleted file mode 100644
+  --- a/copy
+  +++ /dev/null
+  @@ -1,2 +0,0 @@
+  -new
+  -copy1
+
+  $ hg diff --relative dir1 --git -r 2:tip -I '**/rename*'
+  diff --git a/copy b/rename1
+  copy from copy
+  copy to rename1
+  --- a/copy
+  +++ b/rename1
+  @@ -1,2 +1,3 @@
+   new
+   copy1
+  +rename1
+  diff --git a/rename2 b/rename2
+  new file mode 100644
+  --- /dev/null
+  +++ b/rename2
+  @@ -0,0 +1,3 @@
+  +new
+  +copy2
+  +rename2
 
 Delete:
 
-  $ hg rm rename
+  $ hg rm dir1/*
   $ hg ci -mdelete
   $ hg diff --git -r 3:tip
-  diff --git a/rename b/rename
+  diff --git a/dir1/new b/dir1/new
   deleted file mode 100644
-  --- a/rename
+  --- a/dir1/new
   +++ /dev/null
   @@ -1,1 +0,0 @@
   -new
+  diff --git a/dir1/rename1 b/dir1/rename1
+  deleted file mode 100644
+  --- a/dir1/rename1
+  +++ /dev/null
+  @@ -1,3 +0,0 @@
+  -new
+  -copy1
+  -rename1
+  diff --git a/dir1/rename2 b/dir1/rename2
+  deleted file mode 100644
+  --- a/dir1/rename2
+  +++ /dev/null
+  @@ -1,3 +0,0 @@
+  -new
+  -copy2
+  -rename2
 
   $ cat > src <<EOF
   > 1
diff --git a/tests/test-help.t b/tests/test-help.t
--- a/tests/test-help.t
+++ b/tests/test-help.t
@@ -509,6 +509,7 @@
    -B --ignore-blank-lines  ignore changes whose lines are all blank
    -U --unified NUM         number of lines of context to show
       --stat                output diffstat-style summary of changes
+      --relative DIR        produce diffs relative to subdirectory
    -I --include PATTERN [+] include names matching the given patterns
    -X --exclude PATTERN [+] exclude names matching the given patterns
    -S --subrepos            recurse into subrepositories


More information about the Mercurial-devel mailing list