Search code examples
mercurialtortoisehg

What does thg drag_move do? How is it different from hg add and hg remove?


As a user of TortoiseHG, I have been wondering how the thg drag_move command works which mimics (or implements) the functionality behind the "HG Move versioned item(s) here..." context menu entry.

The help entry obtained via thg -v help drag_move gives:

thg drag_move SOURCE... DEST

move the selected files to the desired directory

As far as I understand, it must execute the following sequence (or similar) under the hood:

hg forget SOURCE
mv SOURCE DEST
hg add DEST

But if I do that manually (outside of TortoiseHG), it (naturally) doesn't associate DEST with SOURCE, it rather treats them as individual, unrelated changes.

If I use the GUI or the thg drag_move command, it keeps the history of these entries the same, at least within TortoiseHG I can still see SOURCE's history when I look at DEST's history after the move.

Is this a TortoiseHG extension to Mercurial or is there a hg option to achieve the same "natively"?


Solution

  • TLDR: You can use hg move OLD NEW to achieve the same functionality as thg drag_move.

    Thg is using hg move under the hood when it's doing drag_move (see the run.py and quickop.py sources for details).

    Hg move is the right way of renaming or moving a file in Mercurial because it's tracking the operation, as it says in his help message (hg help mv):

    rename files; equivalent of copy + remove
    
    Mark dest as copies of sources; mark sources for deletion. If dest is a
    directory, copies are put in that directory. If dest is a file, there can
    only be one source.