[PATCH 3 of 3 RFC] import: add new --faithful flag to use metadata but relax checks

Martin von Zweigbergk martinvonz at google.com
Fri Mar 11 13:28:43 EST 2016


On Fri, Mar 11, 2016 at 10:25 AM, Augie Fackler <raf at durin42.com> wrote:
> # HG changeset patch
> # User Augie Fackler <augie at google.com>
> # Date 1457539063 18000
> #      Wed Mar 09 10:57:43 2016 -0500
> # Node ID 7d53477e4496e8f2b16b12ed445407e79bbb787b
> # Parent  602504c64084d85820c883a43b02951a61e992f5
> # EXP-Topic import
> import: add new --faithful flag to use metadata but relax checks
>
> Sometimes it's helpful to import a patch with as much of the metadata
> (especially parents) intact as possible, but some bit of extra didn't
> make the trip through the exported patch. This gives users a tool to
> preserve as much metadata as possible without having to get an exact
> byte-for-byte match on the import process.

Yes, please! But it's unclear to me exactly what metadata it allows to
be lost. I would use it to make sure the parent is correct, so I know
there patches should apply cleanly. Anything else it will make sure is
correct?

>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -935,7 +935,7 @@ def tryimportone(ui, repo, hunk, parents
>
>          if len(parents) == 1:
>              parents.append(repo[nullid])
> -        if opts.get('exact'):
> +        if opts.get('exact') or opts.get('faithful'):
>              if not nodeid or not p1:
>                  raise error.Abort(_('not a Mercurial patch'))
>              p1 = repo[p1]
> @@ -954,7 +954,8 @@ def tryimportone(ui, repo, hunk, parents
>                  p1, p2 = parents
>              if p2.node() == nullid:
>                  ui.warn(_("warning: import the patch as a normal revision\n"
> -                          "(use --exact to import the patch as a merge)\n"))
> +                          "(use --exact or --faithful to import the patch "
> +                          "as a merge)\n"))
>          else:
>              p1, p2 = parents
>
> @@ -965,7 +966,7 @@ def tryimportone(ui, repo, hunk, parents
>              if p2 != parents[1]:
>                  repo.setparents(p1.node(), p2.node())
>
> -            if opts.get('exact') or importbranch:
> +            if opts.get('exact') or opts.get('faithful') or importbranch:
>                  repo.dirstate.setbranch(branch or 'default')
>
>              partial = opts.get('partial', False)
> @@ -984,7 +985,7 @@ def tryimportone(ui, repo, hunk, parents
>                  if message:
>                      msgs.append(message)
>              else:
> -                if opts.get('exact') or p2:
> +                if opts.get('exact') or opts.get('faithful') or p2:
>                      # If you got here, you either use --force and know what
>                      # you are doing or used --exact or a merge patch while
>                      # being updated to its first parent.
> @@ -992,7 +993,7 @@ def tryimportone(ui, repo, hunk, parents
>                  else:
>                      m = scmutil.matchfiles(repo, files or [])
>                  editform = mergeeditform(repo[None], 'import.normal')
> -                if opts.get('exact'):
> +                if opts.get('exact') or opts.get('faithful'):
>                      editor = None
>                  else:
>                      editor = getcommiteditor(editform=editform, **opts)
> @@ -1011,7 +1012,7 @@ def tryimportone(ui, repo, hunk, parents
>                  finally:
>                      repo.ui.restoreconfig(allowemptyback)
>          else:
> -            if opts.get('exact') or importbranch:
> +            if opts.get('exact') or opts.get('faithful') or importbranch:
>                  branch = branch or 'default'
>              else:
>                  branch = p1.branch()
> @@ -1023,7 +1024,7 @@ def tryimportone(ui, repo, hunk, parents
>                                      files, eolmode=None)
>                  except patch.PatchError as e:
>                      raise error.Abort(str(e))
> -                if opts.get('exact'):
> +                if opts.get('exact') or opts.get('faithful'):
>                      editor = None
>                  else:
>                      editor = getcommiteditor(editform='import.bypass')
> @@ -1042,7 +1043,7 @@ def tryimportone(ui, repo, hunk, parents
>              ui.warn(_("warning: can't check exact import with --no-commit\n"))
>          elif opts.get('exact') and hex(n) != nodeid:
>              raise error.Abort(_('patch is damaged or loses information'),
> -                              hint=_('try again without --exact, as the data'
> +                              hint=_('try again using --faithful, as the data'
>                                       ' loss may be minor'))
>          msg = _('applied to working directory')
>          if n:
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -4683,6 +4683,8 @@ def identify(ui, repo, source=None, rev=
>       _('commit even if some hunks fail')),
>      ('', 'exact', None,
>       _('abort if patch would apply lossily')),
> +    ('', 'faithful', None,
> +     _('use metadata like commit parent from patch header')),
>      ('', 'prefix', '',
>       _('apply patch to subdirectory'), _('DIR')),
>      ('', 'import-branch', None,
> diff --git a/tests/test-import-merge.t b/tests/test-import-merge.t
> --- a/tests/test-import-merge.t
> +++ b/tests/test-import-merge.t
> @@ -73,7 +73,7 @@ Test without --exact and diff.p1 != work
>    $ hg import ../merge.diff
>    applying ../merge.diff
>    warning: import the patch as a normal revision
> -  (use --exact to import the patch as a merge)
> +  (use --exact or --faithful to import the patch as a merge)
>    $ tipparents
>    2:890ecaa90481 addc
>    $ hg strip --no-backup tip
> @@ -108,7 +108,7 @@ Test with --bypass and diff.p1 != workin
>    $ hg import --bypass ../merge.diff
>    applying ../merge.diff
>    warning: import the patch as a normal revision
> -  (use --exact to import the patch as a merge)
> +  (use --exact or --faithful to import the patch as a merge)
>    $ tipparents
>    2:890ecaa90481 addc
>    $ hg strip --no-backup tip
> @@ -156,7 +156,7 @@ Test that --exact on a bad header doesn'
>    transaction abort!
>    rollback completed
>    abort: patch is damaged or loses information
> -  (try again without --exact, as the data loss may be minor)
> +  (try again using --faithful, as the data loss may be minor)
>    [255]
>    $ hg verify
>    checking changesets
> @@ -164,3 +164,18 @@ Test that --exact on a bad header doesn'
>    crosschecking files in changesets and manifests
>    checking files
>    1 files, 2 changesets, 2 total revisions
> +
> +Using --faithful allows the slight damage to be imported:
> +  $ hg revert --all
> +  reverting a
> +  $ hg import --faithful ../a.patch
> +  applying ../a.patch
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  patching file a
> +  Hunk #1 succeeded at 1 with fuzz 1 (offset -1 lines).
> +  $ hg verify
> +  checking changesets
> +  checking manifests
> +  crosschecking files in changesets and manifests
> +  checking files
> +  1 files, 3 changesets, 3 total revisions
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list