Skip to content
Snippets Groups Projects
  1. Apr 13, 2018
  2. Apr 17, 2018
  3. Apr 06, 2018
  4. Apr 15, 2018
    • Matt Harbison's avatar
      lfs: enable the final download count status message · ab04972a
      Matt Harbison authored
      At this point, I think all of the core commands are prefetching, except grep and
      verify.  Verify will need some special handling, in case the revlogs are
      corrupt.
      
      Grep has an issue that still needs to be debugged, but we probably need to give
      the behavior some thought too- it would be a shame to have to download
      everything in order to search.  I think the benefit of having this info for all
      commands outweighs extra printing in a command that is arguably not well
      behaved in this context anyway.
      ab04972a
    • Matt Harbison's avatar
      diff: invoke the file prefetch hook · 5e67c209
      Matt Harbison authored
      By invoking it this deep within the command, we pick up both subrepo and hgweb
      support, as well as --patch support for commands that implement logopts.
      5e67c209
  5. Apr 14, 2018
    • Matt Harbison's avatar
      export: invoke the file prefetch hook · b54404d6
      Matt Harbison authored
      cmdutil.exportfile() is only called by shelve, mq and patchbomb.  Those are
      unlikely to mix with lfs, but it may as well be invoked there for completeness.
      b54404d6
    • Matt Harbison's avatar
      scmutil: teach the file prefetch hook to handle multiple commits · 7269b87f
      Matt Harbison authored
      The remainder of the commands that need prefetch deal with multiple revisions.
      I initially coded this as a separate hook, but then it needed a list of files
      to handle `diff` and `grep`, so it didn't seem worth keeping them separate.
      
      Not every matcher will emit bad file messages (some are built from a list of
      files that are known to exist).  But it seems better to filter this in one place
      than to push this on either each caller or each hook implementation.
      7269b87f
  6. Apr 17, 2018
  7. Apr 10, 2018
    • Boris Feld's avatar
      revset: skip legacy lookup for revspec wrapped in 'revset(...)' · 29eb4caf
      Boris Feld authored
      Currently, multiple labels can take forms that can be confused with revset
      (eg: "rev(0)" is a valid tag). Since we look up for tags before evaluating
      revset, this means a tag can shadow a valid revset at any time.
      
      We now enforce the strict revset parsing when wrapped with 'revset(...)'. For
      now, This only work on a whole revspec (but can be used within the revset
      without effect). This might change in the future if we improve the
      implementation.
      
      The feature is undocumented for now, keeping it in the experimental namespace.
      In case a better approach to achieve the same goal is found.
      
      The syntax looks like a revset but is not implemented as such for now. Since the
      goal is to avoid some preprocessing that happens before revset parsing, we
      cannot simply implement it as a revset predicate.
      
      There was other approaches discussed over the mailing-list but they were less
      convincing.
      
      Having a configuration flag to disable legacy lookup have been considered but
      discarded. There are too many common uses of ambiguous identifier (eg: '+',
      '-' or '..') to have the legacy lookup mechanism turned off.
      
      In addition, the  approach can control the parsing of each revset, making
      it more flexible. For example, a revset used as the value of an existing
      configuration option (eg: pushrev) could enforce its resolution as a revset (by
      using the prefix) while user inputs would still use the legacy lookup.
      
      In addition of offering a way to unambiguously input a revset, this prefix
      allow skipping the name lookup providing a significant speedup in some case.
      29eb4caf
  8. Mar 01, 2018
  9. Apr 15, 2018
  10. Mar 22, 2018
  11. Apr 14, 2018
  12. Apr 09, 2018
    • Jun Wu's avatar
      patch: implement a new worddiff algorithm · 35632d39
      Jun Wu authored
      The previous worddiff algorithm has many problems. The major problem is it
      does a "similarity check" that selects a subset of matched lines to do
      inline diffs. It is a bad idea because:
      
        - The "similarity check" is non-obvious to users. For example, a simple
          change from "long long x" to "int64_t x" will fail the similarity check
          and won't be diff-ed as expected.
        - Selecting "lines" to diff won't work as people expect if there are line
          wrapping changes.
        - It has a sad time complexity if lines do not match, could be O(N^2)-ish.
      
      There are other problems in implementation details.
      
        - Lines can match across distant hunks (if the next hunk does not have
          "-" lines).
        - "difflib" is slow.
      
      The solution would be removing the "similarity check", and just diff all
      words in a same hunk. So no content will be missed and everything will be
      diff-ed as expected. This is similar to what code review tool like
      Phabricator does.
      
      This diff implements the word diff algorithm as described above. It also
      avoids difflib to be faster.
      
      Note about colors: To be consistent, "changed inserted" parts and "purely
      insertion blocks" should have a same color, since they do not exist in the
      previous version. Instead of highlighting differences, this patch chooses to
      dim common parts. This is also more consistent with Phabricator or GitHub
      webpage. That said, the labels are defined in a way that people can still
      highlight changed parts and leave purely inserted/deleted hunks use the
      "non-highlighted" color.
      
      As one example, running:
      
        hg log -pr df50b87d8f736aff8dc281f816bddcd6f306930c mercurial/commands.py \
          --config experimental.worddiff=1 --color=debug --config diff.unified=0
      
      The previous algorithm outputs:
      
        [diff.file_a|--- a/mercurial/commands.py	Fri Mar 09 15:53:41 2018 +0100]
        [diff.file_b|+++ b/mercurial/commands.py	Sat Mar 10 12:33:19 2018 +0530]
        [diff.hunk|@@ -2039,1 +2039,4 @@]
        [diff.deleted|-][diff.deleted.highlight|@command('^forget',][diff.deleted| ][diff.deleted.highlight|walkopts,][diff.deleted| _('[OPTION]... FILE...'), inferrepo=True)]
        [diff.inserted|+@command(]
        [diff.inserted|+    '^forget',]
        [diff.inserted|+    walkopts + dryrunopts,]
        [diff.inserted|+ ][diff.inserted.highlight|  ][diff.inserted| _('[OPTION]... FILE...'), inferrepo=True)]
        [diff.hunk|@@ -2074,1 +2077,3 @@]
        [diff.deleted|-    rejected = cmdutil.forget(ui, repo, m, prefix="",][diff.deleted.highlight| explicitonly=False)[0]]
        [diff.inserted|+    dryrun = opts.get(r'dry_run')]
        [diff.inserted|+    rejected = cmdutil.forget(ui, repo, m, prefix="",]
        [diff.inserted|+                              explicitonly=False, dryrun=dryrun)[0]]
      
      The new algorithm outputs:
      
        [diff.file_a|--- a/mercurial/commands.py	Fri Mar 09 15:53:41 2018 +0100]
        [diff.file_b|+++ b/mercurial/commands.py	Sat Mar 10 12:33:19 2018 +0530]
        [diff.hunk|@@ -2039,1 +2039,4 @@]
        [diff.deleted|-][diff.deleted.unchanged|@command(][diff.deleted.unchanged|'^forget',][diff.deleted.unchanged| ][diff.deleted.changed|walkopts][diff.deleted.unchanged|,][diff.deleted.changed| ][diff.deleted.unchanged|_('[OPTION]... FILE...'), inferrepo=True)]
        [diff.inserted|+][diff.inserted.unchanged|@command(]
        [diff.inserted|+][diff.inserted.changed|    ][diff.inserted.unchanged|'^forget',]
        [diff.inserted|+][diff.inserted.changed|    walkopts][diff.inserted.unchanged| ][diff.inserted.changed|+ dryrunopts][diff.inserted.unchanged|,]
        [diff.inserted|+][diff.inserted.changed|    ][diff.inserted.unchanged|_('[OPTION]... FILE...'), inferrepo=True)]
        [diff.hunk|@@ -2074,1 +2077,3 @@]
        [diff.deleted|-][diff.deleted.unchanged|    rejected = cmdutil.forget(ui, repo, m, prefix="",][diff.deleted.changed| ][diff.deleted.unchanged|explicitonly=False][diff.deleted.unchanged|)[0]]
        [diff.inserted|+][diff.inserted.changed|    dryrun = opts.get(r'dry_run')]
        [diff.inserted|+][diff.inserted.unchanged|    rejected = cmdutil.forget(ui, repo, m, prefix="",]
        [diff.inserted|+][diff.inserted.changed|                              ][diff.inserted.unchanged|explicitonly=False][diff.inserted.changed|, dryrun=dryrun][diff.inserted.unchanged|)[0]]
      
      Practically, when diffing a 8k line change, the time spent on worddiff
      reduces from 4 seconds to 0.14 seconds.
      
      Differential Revision: https://phab.mercurial-scm.org/D3212
      35632d39
  13. Mar 19, 2018
    • Jun Wu's avatar
      patch: buffer lines for a same hunk · 54713489
      Jun Wu authored
      Instead of yielding tokens directly, buffer them if they belong to a same
      hunk. This makes it easier for the upcoming new worddiff algorithm to only
      focus on the diff hunk, instead of having to worry about other contents.
      
      This breaks how the existing experimental worddiff algorithm works, so the
      algorithm was removed, and related tests are disabled for now. The next patch
      will add a new worddiff algorithm.
      
      Differential Revision: https://phab.mercurial-scm.org/D3211
      54713489
Loading