Accessing hidden commits by hash (directaccess extension)

Durham Goode durham at fb.com
Fri Aug 25 18:26:05 UTC 2017


One of the extensions we've been using inside Facebook, and that Pulkit 
will be helping us upstream soon, is the directaccess extension. It 
allows a user to pass the hash of hidden commits to the Mercurial 
command line and those commits will be temporarily unhidden for the 
duration of the command (instead of printing a 'abort: hidden revision' 
error).

Since this differs from the current hidden commit behavior, I wanted to 
document why we've found it useful, and what the extension does to 
prevent dumb mistakes (like pushing a hidden commit by accidentally 
pasting the wrong hash).

Motivation
===

One of the core lessons we've learned from our users is that it's 
critical to instill confidence that they can recover from mistakes. In 
our experience, allowing the user to see any commit they have the hash 
for helps give them this confidence.

The current hidden experience makes this difficult. If a commit is 
hidden and a user types 'hg log -r HIDDEN_HASH', they are blocked from 
accessing that commit, despite them knowing the commit exists and 
explicitly telling us they want to see it. Even worse, the error message 
tells them to use --hidden, which gets them in the habit of using that 
flag whenever something goes wrong, which can cause even more horrible 
issues since most users don't understand what it actually does.

directaccess works by taking any explicit hash passed to the command and 
makes that hash visible in the computehidden result set. So the command 
proceeds as if the commit was not hidden. It only works for hashes, not 
rev numbers.

Preventing Mistakes
===

One of the reasons for preventing users from accessing hidden commits is 
to prevent them from doing bad things with them (like pushing them, or 
amending them and causing divergence). To address this, directaccess 
treats read commands, recoverable-write commands, and 
unrecoverable-write commands separately.

For read commands (a whitelist of commands in the code), it allows the 
user to access the commit like normal.

For recoverable-write commands, like commit/amend/rebase, it prints 
"Warning: accessing hidden changesets %s for write operation".

For unrecoverable-write commands (a whitelist), like push and serve, it 
blocks the command like normal, with the 'abort: hidden revision' error.

Questions?
===

We think this strikes a good balance between making it easy for users to 
access the commits they care about, while preventing the most painful 
mistakes.

Let me know if you have any concerns. I wanted to get any discussion out 
of the way now, before we start sending code out.


directaccess source code: 
https://bitbucket.org/facebook/hg-experimental/src/c29e61682661e4b1eb86570ba4c2a58aa75ff7a3/hgext3rd/directaccess.py


More information about the Mercurial-devel mailing list