Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.8.2, 0.8.3, and 0.9

stable cmenu: improve single directory shell context menu behavior

This reverts us mostly back to 0.7 behavior. When you right click on a single
folder, you get a 'files selected' context menu. Commands launched from this
menu will be "rooted" in that directory: commit, log, etc will only consider
files within that directory.

The repository root gets special treatment. Opening a context menu on a
repository root folder icon opens the same menu you would get if you had opened
that folder and spawned a menu from the background.

Apps launched from context menus opened from the folder background (no files
selected), are still "rooted" at the repository root. This also does not
resolve issue #55, where the user would like to be able to change the root after
it has been launched.

Refs #445, #429

Changeset 6ca6aa839d0a

Parent b8ea4474d314

by Steve Borho

Changes to one file · Browse files at 6ca6aa839d0a Showing diff from parent b8ea4474d314 Diff from another changeset...

 
337
338
339
340
 
 
 
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
 
357
358
 
 
 
 
 
 
 
 
 
 
 
359
360
361
362
363
 
 
 
364
365
366
367
368
369
 
655
656
657
658
659
660
661
662
663
664
665
666
 
 
 
 
 
 
 
667
 
 
 
668
669
670
 
698
699
700
701
702
703
704
705
706
707
708
 
337
338
339
 
340
341
342
343
344
345
346
347
 
 
 
 
 
 
348
349
350
351
 
352
353
 
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
 
369
370
371
372
 
 
373
374
375
 
661
662
663
 
 
 
 
 
 
664
665
 
666
667
668
669
670
671
672
673
674
675
676
677
678
679
 
707
708
709
 
 
 
 
 
710
711
712
@@ -337,33 +337,39 @@
  }   while (found != std::string::npos);   - // check if target directory is a Mercurial repository + // Select menu to show + bool fileMenu = myFiles.size() > 0; + bool isHgrepo = false;   std::string cwd;   if (!myFolder.empty())   {   cwd = myFolder;   } - else if (myFiles.size() == 1 && IsDirectory(myFiles[0])) - { - myFolder = myFiles[0]; - cwd = myFolder; - myFiles.clear(); - }   else if (!myFiles.empty())   {   cwd = IsDirectory(myFiles[0])? myFiles[0] : DirName(myFiles[0]);   } - bool isHgrepo = false; +   if (!cwd.empty()) - isHgrepo = IsHgRepo(cwd); + { + // check if target directory is a Mercurial repository + std::string root = GetHgRepoRoot(cwd); + isHgrepo = !root.empty(); + if (cwd == root && myFiles.size() == 1) + { + fileMenu = false; + myFolder = cwd; + myFiles.clear(); + } + }     /* We have three menu types: files-selected, no-files-selected, no-repo */   menuDescListEntries *entries;   if (isHgrepo) - if (myFiles.empty()) + if (fileMenu) + entries = RepoFilesMenu; + else   entries = RepoNoFilesMenu; - else - entries = RepoFilesMenu;   else   entries = NoRepoMenu;   @@ -655,16 +661,19 @@
  {   cwd = myFolder;   } - else if (myFiles.size() == 1 && IsDirectory(myFiles[0])) - { - // Treat single selected directory as if cmenu were opened - // within that directory without files selected - cwd = myFiles[0]; - }   else if (!myFiles.empty())   { - cwd = IsDirectory(myFiles[0])? myFiles[0] : DirName(myFiles[0]); + cwd = IsDirectory(myFiles[0]) ? myFiles[0] : DirName(myFiles[0]); + } + else + { + TDEBUG_TRACE("DoHgtk: can't get cwd"); + return; + }   + + if (!myFiles.empty()) + {   const std::string tempfile = GetTemporaryFile();   if (tempfile.empty())   { @@ -698,11 +707,6 @@
  CloseHandle(tempfileHandle);   hgcmd += " --listfile " + Quote(tempfile);   } - else - { - TDEBUG_TRACE("DoHgtk: can't get cwd"); - return; - }     if (cmd == "thgstatus")   {